多次分组SQL Server中的位置

Ple*_*ase 0 sql sql-server sql-server-2014

我有这样的源表

ProductName SaleReceipt SaleCode
--------------------------------
F-Apple     1001        1
F-Orange    1002        2
G-Rice      1003        3
G-Barile    1005        4
G-Oats      1006        1
V-Carrot    1007        4
V-Cabbage   1008        3
V-Potato    1009        1
V-Tomato    1010        1
Chocolate   1011        4
Cookies     1012        1
Cakes       1013        2
Run Code Online (Sandbox Code Playgroud)

我需要创建一个这样的报告

                30 Day delay    60 Day Delay    90 day delay    120 day delay
Fruits          1               1               0               0
Grains          1               0               1               1
Vegetables      2               0               1               1 
Other category  1               1               0               1
Run Code Online (Sandbox Code Playgroud)

创建报告的条件是:

  • 所有以F开头的ProductName都被分组为fruit
  • 所有以G开头的ProductName都被分组为Grains
  • 所有以V开头的ProductName都被分组为Vegetables
  • 其他产品名称在其他类别中

  • 30天延迟:SaleDode = 1的(SaleReceipt)计数

  • 60天延迟:SaleDode = 2的(SaleReceipt)计数
  • 90天延迟:SaleDode = 3的(SaleReceipt)计数
  • 120天延迟:SaleReode的计数(SaleReceipt)> = 4

    我找不到如何分组两次.我正在使用SQL Server 2014.

Gor*_*off 6

你可以case在一个group by.或者使用查找表:

select coalesce(c.name, 'Other category'),
       sum(case when salescode = 1 then 1 else 0 end) as salecode_1,
       sum(case when salescode = 2 then 1 else 0 end) as salecode_2,
       sum(case when salescode = 3 then 1 else 0 end) as salecode_3,
       sum(case when salescode = 4 then 1 else 0 end) as salecode_4
from t left join
     (values ('F-%', 'Fruit'), ('G-%' , 'Grain'), ('V-%', 'Vegetable')
     ) c(pattern, name)
     on t.productname like c.pattern
group by coalesce(c.name, 'Other category');
Run Code Online (Sandbox Code Playgroud)