按不同的价值观分组

Dat*_*101 0 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
Run Code Online (Sandbox Code Playgroud)

我希望能够像下面这样分组:

--------------------------------------
DAY MONTH   YEAR    VISITOR_COUNT
--------------------------------------
1   |   12    | 2014  | 16260
2-31|   12    | 2014  | 309971
1   |   1     | 2015  | 9965
2-31|   1     | 2015  | 404176
Run Code Online (Sandbox Code Playgroud)

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

Gor*_*off 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);
Run Code Online (Sandbox Code Playgroud)

好的,这有点棘手.在casegroup bycaseselect是不同的.在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);
Run Code Online (Sandbox Code Playgroud)