【发布时间】:2016-06-27 03:19:10
【问题描述】:
我正在使用 SQL Server 2008 R2。我正在尝试创建一个按 3M、6M、9M、12M 总计汇总总计的查询。以下是一些示例数据:
create table invoice (store int, invoice_date datetime, customer int, is_repeat varchar(1));
insert into invoice (store, invoice_date, customer, is_repeat)
values (1, '2015-10-05', 1, 'N'),
(1, '2016-03-04', 1, 'Y'),
(1, '2016-02-07', 1, 'Y'),
(1, '2015-08-03', 2, 'Y'),
(2, '2015-12-01', 3, 'Y'),
(2, '2016-02-16', 4, 'Y'),
(2, '2015-06-11', 3, 'Y'),
(2, '2015-09-18', 4, 'Y');
查询需要给出 3M、6M 等“Y”值的计数,并按商店、月份和年份进行聚合。例如,2016 年 3 月的商店 1 应该有一条记录,该记录总计 2015 年 12 月 1 日和 2016 年 2 月 29 日之间的“Y”值的数量,并将该值放入 3M 列。然后将 2015 年 9 月 1 日和 2016 年 2 月 29 日之间的值相加,并将这些值放在 6M 列中。
以下是上述数据的查询结果示例:
STORE MONTH YEAR 3M_REPEATS 6M_REPEATS
----- ----- ---- ---------- ----------
1 2 2016 0 2
1 3 2016 1 2
2 2 2016 1 3
2 3 2016 2 3
我正在尝试寻找一个优雅的解决方案,但我不确定是否应该使用 CTE、PIVOT 或 OVER(PARTITION BY),还是只使用标准的 GROUP BY 子句。
编辑添加:我最终只需要此表中的最后 12 个月,因此此表中只有 12 条记录。例如,如果当前月份/年份是 3/2016,则它将具有 2/2015 - 3/2016 以及每个月的总数。
【问题讨论】:
-
如果一个月内没有任何记录(例如,您的样本中为 2015 年 11 月),是否还需要在结果中显示为一行?
-
@Ross Presser 是的,对于给定的商店、月份和年份,如果在过去 3 个月/6 个月内没有 is_repeat = 'Y' 的记录,我仍然希望看到该商店/月/年的记录,但 3M 和 6M 的总数为 0。在我的商店 2 示例数据中,由于 2015-09-18 和 2015-06-11 invoice_date 值,2015 年 11 月的结果行将具有 3M_REPEATS = 1 和 6M_REPEATS = 2。我希望这能回答您的问题,并感谢您的帮助。
标签: sql sql-server sql-server-2008-r2 aggregation