需要具有动态日期范围计数功能的T-SQL数据透视

时间:2018-10-16 22:07:55

标签: sql-server tsql pivot

我需要T-SQL上无法解决的枢纽问题。

这些是要求:

  1. 需要将开始日期和结束日期定义为“ yyyy-MM”
  2. 每月总计
  3. 每个月只需计算一个“ ClientID”(请参阅​​2018-05中的“ A”)

我有一张带有示例数据的表:

ClientID    Model   LastSyncTime_DW
---------------------------------------------
1           A       2018-09-26 00:00:00.000
2           A       2018-09-05 00:00:00.000
1           A       2018-08-19 00:00:00.000
1           A       2018-07-25 00:00:00.000
3           B       2018-07-03 00:00:00.000
1           A       2018-06-10 00:00:00.000
3           B       2018-06-07 00:00:00.000
8           A       2018-06-01 00:00:00.000
1           A       2018-05-31 00:00:00.000 (duplicate ClientID for this month - count only one)
3           B       2018-05-29 00:00:00.000
4           C       2018-05-26 00:00:00.000
5           D       2018-05-25 00:00:00.000
6           C       2018-05-24 00:00:00.000
1           A       2018-05-19 00:00:00.000 (duplicate ClientID for this month - count only one)
7           D       2018-05-12 00:00:00.000
8           A       2018-05-09 00:00:00.000
9           A       2018-05-05 00:00:00.000

结果应该是这样的:

Model   2018-09 2018-08 2018-07 2018-06 2018-5
-----------------------------------------------
A       2       1       1       2       3
B                       1       1       
C                                       2
D                                       2

请帮助!

2 个答案:

答案 0 :(得分:0)

这是您想要的吗?

select model,
       count(distinct case when LastSyncTime_DW >= '2018-09-01' and LastSyncTime_DW < '2018-10-01' then ClientID end) as cnt_201809,
       count(distinct case when LastSyncTime_DW >= '2018-08-01' and LastSyncTime_DW < '2018-10-01' then ClientID end) as cnt_201808,
       . . .
from t
group by model;

结果与您的主要区别在于,它返回0而不是NULL

答案 1 :(得分:0)

    Create table #Pivot 
    (ClientID     int,Model  varchar(2),LastSyncTime_DW datetime)

    Insert into #Pivot Values   (1, 'A',    '2018-09-26'),
                        (2, 'A',    '2018-09-05'),
                        (1, 'A',    '2018-08-19'),
                        (1, 'A',    '2018-07-25'),
                        (3, 'B',    '2018-07-03'),
                        (1, 'A',    '2018-06-10'),
                        (3, 'B',    '2018-06-07'),
                        (8, 'A',    '2018-06-01'),
                        (1, 'A',    '2018-05-31'),
                        (3, 'B',    '2018-05-29'),
                        (4, 'C',    '2018-05-26'),
                        (5, 'D',    '2018-05-25'),
                        (6, 'C',    '2018-05-24'),
                        (1, 'A',    '2018-05-19'),
                        (7, 'D',    '2018-05-12'),
                        (8, 'A',    '2018-05-09'),
                        (9, 'A',    '2018-05-05')

Select * from #Pivot

  select model,
   count(distinct case when LastSyncTime_DW >= '2018-09-01' and LastSyncTime_DW < '2018-10-01' then ClientID end) as cnt_201809,
   count(distinct case when LastSyncTime_DW >= '2018-08-01' and LastSyncTime_DW < '2018-09-01' then ClientID end) as cnt_201808,
   count(distinct case when LastSyncTime_DW >= '2018-07-01' and LastSyncTime_DW < '2018-08-01' then ClientID end) as cnt_201807,
   count(distinct case when LastSyncTime_DW >= '2018-06-01' and LastSyncTime_DW < '2018-07-01' then ClientID end) as cnt_201806,
   count(distinct case when LastSyncTime_DW >= '2018-05-01' and LastSyncTime_DW < '2018-06-01' then ClientID end) as cnt_201805
 from #Pivot
 group by model;

您将获得以下结果

enter image description here