按不同的价值观分组

时间:2017-03-24 16:58:03

标签: sql sql-server

我想在第一天分组,然后在本月余下的时间内分组,我的数据可以跨越多年。

我有以下数据:

--------------------------------------
DAY MONTH   YEAR    VISITOR_COUNT
--------------------------------------
1   |   12    | 2014  | 16260
2   |   12    | 2014  | 15119
3   |   12    | 2014  | 14464
4   |   12    | 2014  | 13746
5   |   12    | 2014  | 13286
6   |   12    | 2014  | 14352
7   |   12    | 2014  | 19293
8   |   12    | 2014  | 13338
9   |   12    | 2014  | 13961
10  |   12    | 2014  | 9519
11  |   12    | 2014  | 10204
12  |   12    | 2014  | 9380
13  |   12    | 2014  | 11611
14  |   12    | 2014  | 14839
15  |   12    | 2014  | 10051
16  |   12    | 2014  | 8983
17  |   12    | 2014  | 7348
18  |   12    | 2014  | 7258
19  |   12    | 2014  | 7205
20  |   12    | 2014  | 6113
21  |   12    | 2014  | 5316
22  |   12    | 2014  | 6914
23  |   12    | 2014  | 6880
24  |   12    | 2014  | 6289
25  |   12    | 2014  | 6000
26  |   12    | 2014  | 13328
27  |   12    | 2014  | 10367
28  |   12    | 2014  | 7946
29  |   12    | 2014  | 9042
30  |   12    | 2014  | 9408
31  |   12    | 2014  | 8411
1   |   1     | 2015  | 9965
2   |   1     | 2015  | 10560
3   |   1     | 2015  | 9662
4   |   1     | 2015  | 8735
5   |   1     | 2015  | 12817
6   |   1     | 2015  | 13516
7   |   1     | 2015  | 9800
8   |   1     | 2015  | 10629
9   |   1     | 2015  | 12325
10  |   1     | 2015  | 11899
11  |   1     | 2015  | 11049
12  |   1     | 2015  | 13934
13  |   1     | 2015  | 16833
14  |   1     | 2015  | 13434
15  |   1     | 2015  | 13128
16  |   1     | 2015  | 14660
17  |   1     | 2015  | 11951
18  |   1     | 2015  | 10916
19  |   1     | 2015  | 14126
20  |   1     | 2015  | 16909
21  |   1     | 2015  | 16555
22  |   1     | 2015  | 14726
23  |   1     | 2015  | 14642
24  |   1     | 2015  | 13067
25  |   1     | 2015  | 11738
26  |   1     | 2015  | 15353
27  |   1     | 2015  | 17935
28  |   1     | 2015  | 14448
29  |   1     | 2015  | 15372
30  |   1     | 2015  | 16694
31  |   1     | 2015  | 16763

我希望能够将其分组如下:

--------------------------------------
DAY MONTH   YEAR    VISITOR_COUNT
--------------------------------------
1   |   12    | 2014  | 16260
2-31|   12    | 2014  | 309971
1   |   1     | 2015  | 9965
2-31|   1     | 2015  | 404176

Microsoft SQL Server 2016.兼容级别:SQL Server 2005(90)

1 个答案:

答案 0 :(得分:6)

只需使用case

select (case when min(day) = 1 then '1'
             else concat(min(day), '-', max(day))
        end) as day, month, year,
       sum(visitor_count)
from t
group by year, month,
         (case when day = 1 then 1 else 2 end);

好的,这有点棘手。 case中的group bycase中的select不同。 group by只将日期分为两类,1类和其他类别。 select选择月中的最小和最大天数,以构建范围字符串。

编辑:

Oy,SQL Server 2005 ??? 当然,您可以使用+和类型转换,或使用replace()执行相同的操作:

select (case when min(day) = 1 then '1'
             else replace(replace('@min-@max', '@min', min(day)), '@max', max(day))
        end) as day, month, year,
       sum(visitor_count)
from t
group by year, month,
         (case when day = 1 then 1 else 2 end);