Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 填写缺失的日期和分组问题_Sql_Sql Server_Tsql_Date_Group By - Fatal编程技术网

Sql 填写缺失的日期和分组问题

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

我有一个包含案例记录的表,其中包含案例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      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