我正在处理一个数据集,其中包含服务列表的预付费数据。结构为:名称、服务、服务开始日期、服务终止日期。
我需要每年报告这些数据,每个月,回答这个问题:对于给定的服务和月份,有多少人是预付费的?结果将是包含的,这意味着如果名称和服务组合在1天或更多天内达到一个月,则会报告它们。
使用SQL或SQL变体实现这一点的最佳方法是什么?
谢谢!
输入和输出数据示例如下:
在:
Name,Service,Start,End jon,a,05/12/2018,08/26/2018 paul,b,06/05/2018,08/08/2018 michael,a,02/18/2018,08/15/2018 mary,a,04/22/2018,10/14/2018 jonas,b,05/10/2018,07/02/2018 thomas,a,08/05/2018,10/18/2018 jessica,c,03/09/2018,07/16/2018 arthur,c,02/03/2018,03/15/2018 hugo,c,06/07/2018,09/01/2018 larry,a,11/23/2018,12/20/2018 nick,b,08/23/2018,11/22/2018 beth,c,09/20/2018,12/25/2018 ashley,a,04/14/2018,05/19/2018 tim,a,01/05/2018,05/26/2018 allan,b,06/28/2018,12/11/2018 jeffrey,b,03/04/2018,04/22/2018 steven,b,01/20/2018,06/07/2018 dawn,c,06/15/2018,10/14/2018 brandy,b,09/01/2018,10/08/2018 christine,a,04/15/2018,07/31/2018
输出:
Service,Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec a,1,2,2,5,6,4,4,4,2,2,1,1 b,1,1,2,2,2,4,3,3,3,3,2,1 c,0,1,2,1,1,3,3,2,3,2,1,1
发布于 2018-08-31 07:21:15
您可以尝试使用条件聚合。对于2018年,这可能看起来像:
SELECT [service],
count(DISTINCT
CASE
WHEN [start] < '2018-02-01'
OR [end] >= '2018-01-01' THEN
[name]
END) [jan],
count(DISTINCT
CASE
WHEN [start] < '2018-03-01'
OR [end] >= '2018-02-01' THEN
[name]
END) [feb],
...
count(DISTINCT
CASE
WHEN [start] < '2019-01-01'
OR [end] >= '2018-12-01' THEN
[name]
END) [dec]
FROM [elbat]
GROUP BY [service];
我假设您想要不同的人数(一个人只计算一次,即使他们出现了多次)。如果不是这样,请卸下DISTINCT
%s。
我进一步假设,如果服务周期仅与月份重叠,则需要进行计数。如果您只想计数,如果该期间完全包含在一个月中,请将条件更改为:
[start] >= <first of month>
AND [end] < <first of next month>
(替换<first of month>
和<first of next month>
。)
顺便说一句,人们是按名字命名的,这是一个坏主意。你怎么知道是一个人还是多个人,是否有更多的"John Smith“?
https://stackoverflow.com/questions/52106471
复制相似问题