Sql 填写缺失的日期和分组问题
我有一个包含案例记录的表,其中包含案例ID、用户ID、打开日期、关闭日期等值 对于报告,我需要有一个结果表,按连续月份列出所有用户,其中包括仍然打开的案例数量(金额)和关闭的案例数量(金额)Sql 填写缺失的日期和分组问题,sql,sql-server,tsql,date,group-by,Sql,Sql Server,Tsql,Date,Group By,我有一个包含案例记录的表,其中包含案例ID、用户ID、打开日期、关闭日期等值 对于报告,我需要有一个结果表,按连续月份列出所有用户,其中包括仍然打开的案例数量(金额)和关闭的案例数量(金额) CaseID | UserID | Opened On | Closed Date| Value 1 U1 04/01/2020 05/02/2020 500 2 U1 08/01/2020 null 120 3 U3
CaseID | UserID | Opened On | Closed Date| Value
1 U1 04/01/2020 05/02/2020 500
2 U1 08/01/2020 null 120
3 U3 16/01/2020 null 350
4 U2 21/01/2020 25/01/2020 100
5 U1 25/01/2020 08/04/2020 150
6 U2 05/02/2020 null 790
7 U4 14/02/2020 18/03/2020 190
8 U4 19/02/2020 null 490
9 U1 21/02/2020 27/02/2020 140
10 U2 07/03/2020 17/03/2020 640
11 U1 17/03/2020 12/05/2020 420
12 U3 22/03/2020 null 810
13 U2 05/04/2020 19/05/2020 320
14 U1 18/04/2020 null 180
15 U4 16/05/2020 22/05/2020 210
16 U3 19/05/2020 null 230
括号中的输出所需*值仅用于帮助
UserID | Month | Nb case still opened | Total Open | Nb closed case | Total Value closed
U1 01 3 (1 ;2 ;5)* 770 0 0
U1 02 2 (2 ;5) 270 2 (1;9) 640
U1 03 3 (2;5;11) 690 0 0
U1 04 3 (2;11;14) 720 1 (5) 150
U1 05 2 (2 ;14) 300 1 (11) 420
U2 01 0 0 1 100
U2 02 1 (6) 790 0 0
U2 03 1 (6) 790 1 640
U2 04 2 (6 ;13) 1100 0 0
U2 05 1 (6) 790 1 (13) 320
U3 01 1 (3) 350 0 0
U3 02 1 (3) 350 0 0
U3 03 2 (6 ;12) 1160 0 0
U3 04 2 (6 ;12) 1160 0 0
U3 05 3 (6 ;12 ;16) 1390 0 0
U4 01 0 0 0 0
U4 02 1 (7 ;8) 680 0 0
U4 03 2 (8) 490 1 190
U4 04 1 (8) 490 0 0
U4 05 1 (8) 490 1 210
我试图在分区上玩交叉连接,但没有找到解决方案。
谢谢你的帮助 我首先交叉加入可用的年/月和用户,以生成行。然后,可以使用子查询中的union all来取消拾取可以使用交叉应用的开始和结束信息 最后一步是聚合和窗口计算:
select
u.userID,
d.dt year_month,
sum(coalesce(sum(no_open - no_closed), 0))
over(partition by u.userID order by d.dt) no_cases_still_open,
sum(coalesce(sum(value_open - value_closed), 0))
over(partition by u.userID order by d.dt) value_open,
coalesce(sum(no_closed), 0) no_closed,
coalesce(sum(value_closed), 0) value_closed
from
(select distinct datefromparts(year(openedOn), month(openedOn), 1) dt from mytable) d
cross join (select distinct userID from mytable) u
left join (
select userID, openedOn dt, 1 no_open, value value_open, 0 no_closed, 0 value_closed from mytable
union all
select userID, closedDate dt, 0, 0, 1, value from mytable
) t
on t.userID = u.userID
and t.dt >= d.dt and t.dt < dateadd(month, 1, d.dt)
group by u.userID, d.dt
:
当您的表包含超过12个月的数据时,会发生什么情况?现在就想,现在就计划!当我有了解决方案,事情就这么简单了。谢谢。左连接是关键,非常智能。 userID | year_month | no_cases_still_open | value_open | no_closed | value_closed :----- | :--------- | ------------------: | ---------: | --------: | -----------: U1 | 2020-01-01 | 3 | 770 | 0 | 0 U1 | 2020-02-01 | 2 | 270 | 2 | 640 U1 | 2020-03-01 | 3 | 690 | 0 | 0 U1 | 2020-04-01 | 3 | 720 | 1 | 150 U1 | 2020-05-01 | 2 | 300 | 1 | 420 U2 | 2020-01-01 | 0 | 0 | 1 | 100 U2 | 2020-02-01 | 1 | 790 | 0 | 0 U2 | 2020-03-01 | 1 | 790 | 1 | 640 U2 | 2020-04-01 | 2 | 1110 | 0 | 0 U2 | 2020-05-01 | 1 | 790 | 1 | 320 U3 | 2020-01-01 | 1 | 350 | 0 | 0 U3 | 2020-02-01 | 1 | 350 | 0 | 0 U3 | 2020-03-01 | 2 | 1160 | 0 | 0 U3 | 2020-04-01 | 2 | 1160 | 0 | 0 U3 | 2020-05-01 | 3 | 1390 | 0 | 0 U4 | 2020-01-01 | 0 | 0 | 0 | 0 U4 | 2020-02-01 | 2 | 680 | 0 | 0 U4 | 2020-03-01 | 1 | 490 | 1 | 190 U4 | 2020-04-01 | 2 | 700 | 0 | 0 U4 | 2020-05-01 | 1 | 490 | 1 | 210