我有桌子,我把它叫做手动值,稍后在我的代码中使用。此表看起来像这样:按天分配行均匀
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