【发布时间】:2017-05-04 09:03:50
【问题描述】:
我有一个表,我把它称为手动值,稍后在我的代码中使用。这张表是这样的:
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 月在 Country NO 中使用 EntryMethod BCD 的包裹有 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)
说明:我正在使用 Year 和 Month 字段创建日期归档,并且 NTILE 超过月份的天数(现在它是静态数字,但稍后会更改) .结果并不像我预期的那样好,它创建的组是应有的两倍(每个日期 14 行而不是 7 行)。
【问题讨论】:
-
我认为它比我简单得多:) 有人建议我使用 NTILE 窗口函数。它正是我想要的。完成后将发布答案。
-
现在我再看一遍,我想我确实误解了这个问题。您希望将结果作为查询,我以为您希望将它们作为表中的 INSERT
-
@ThomasG 它是查询还是插入的结果都没有关系。只是算法很重要
标签: sql tsql business-intelligence sql-server-2016