我有桌子,我把它叫做手動值,稍後在我的代碼中使用。此表看起來像這樣:按天分配行均勻
subId | MonthNo | PackagesNumber | Country | EntryMethod | PaidAmount | Version
1 | 201701 | 223 | NO | BCD | 44803 | 2
2 | 201701 | 61 | NO | GHI | 11934 | 2
3 | 201701 | 929 | NO | ABC | 88714 | 2
4 | 201701 | 470 | NO | DEF | 98404 | 2
5 | 201702 | 223 | NO | BCD | 28225 | 2
我所要做的就是將這些值分成單行,在單個包的級別。例如,2017年1月在EntryNethod BCD的Country NO中有223個包,所以我需要223個單獨的行。 PaidAmount也應該被PackagesNumber的數量除。
問題是我必須將日期關聯到每條記錄。記錄應該整個月均勻分發。我有日期維度,我可以通過從MontNo分別拉月和年來與我的表相交。 例如,2017年1月,EntryMethod BCD我擁有軟件包,所以它每天約7個軟件包。
這就是我想要的東西:
subId | Date | Country | Packages | EntryMethod | PaidAmount | Version
1 | 01.01.2017 | NO | 1 | BCD | 200.910313901345 | 2
2 | 01.01.2017 | NO | 1 | BCD | 200.910313901345 | 2
3 | 01.01.2017 | NO | 1 | BCD | 200.910313901345 | 2
4 | 01.01.2017 | NO | 1 | BCD | 200.910313901345 | 2
5 | 01.01.2017 | NO | 1 | BCD | 200.910313901345 | 2
6 | 01.01.2017 | NO | 1 | BCD | 200.910313901345 | 2
7 | 01.01.2017 | NO | 1 | BCD | 200.910313901345 | 2
8 | 02.01.2017 | NO | 1 | BCD | 200.910313901345 | 2
獎勵:我寫的代碼,這將包成單的記錄,它把每個月的第一天日期。
SELECT
Date =
(
SELECT TOP 1
date
FROM dim_Date dim
WHERE dim.Month = a.Month
AND dim.Year = a.Year
)
, Country
, EntryMethod
, Deliveries = 1
, PaidAmount = NULLIF(PaidAmount, 0)/PackagesNumber
, SubscriptionId = 90000000 + ROW_NUMBER() OVER(ORDER BY n.number)
, Version
FROM
(
SELECT
[Year] = LEFT(MonthNo, 4)
, [Month] = RIGHT(MonthNo, 2)
, Country
, EntryMethod
, PackagesNumber
, PaidAmount
, Version
FROM tgm.rep_PredictionsReport_ManualValues tgm
/*WHERE MonthNo = 201701*/
) a
JOIN master..spt_values n
ON n.type = 'P'
AND n.number < CAST(PackagesNumber AS INT);
編輯:我取得了一些進展。我使用了NTILE函數,將行分成組。 唯一改變的是日期從頂級選擇。它看起來像現在:
Date = concat([Year], '-', [Month], '-', case when ntile(31) over(order by n.number) < 10 then '0' + cast(ntile(31) over(order by n.number) as varchar(2)) else cast(ntile(31) over(order by n.number) as varchar(2)) end)
說明:我創建日期使用年和月領域提交,NTILE過在一個月的天數(現在它是靜態的數字,但後來改變) 。結果並不像我預期的那樣好,它創造的團體應該是它們的兩倍(14日而不是7日)。
我覺得它比我雖然簡單得多:)有人建議我使用NTILE窗口功能。它正是我想要的。當我完成後,會發布答案。 – Dodzik
現在我再讀一遍,我想我的確誤解了這個問題。你想要你的結果作爲一個查詢,我想你想他們作爲INSERTs在表 –
@ThomasG這是無關緊要,如果它是查詢或插入的結果。只是算法很重要 – Dodzik