TSQL PIVOT/UNPIVOT 多个汇总列

Posted

技术标签:

【中文标题】TSQL PIVOT/UNPIVOT 多个汇总列【英文标题】:TSQL PIVOT/UNPIVOT Multiple Summarized Columns 【发布时间】:2020-10-28 15:49:20 【问题描述】:

似乎这是一个热门话题,但我似乎无法复制其他答案。

我的数据已经按月/年汇总了多个类别。

month   calls   deals   productssold   avgsaleprice 
    1      25       6              7            500
    2      17       2              4            300
    3      15       3              5            600
    4      22       1              1            800
    5      18       7             12            300
    6      12       9             15            250   

我想要得到的是这个

    category   1   2   3   4   5   6
       calls  25  17  15  22  18  12
       deals   6   2   3   1   7   9
productssold   7   4   5   1  12  15
avgsaleprice 500 300 600 800 300 250

这是提供数据的查询

declare @summarizedtable table (
 month int,
 calls int,
 deals int,
 productssold int,
 avgsaleprice int)    
 
 insert into @summarizedtable (month, calls, deals, productssold, avgsaleprice)
 values (1,25,6,7,500),
        (2,17,2,4,300),
        (3,15,3,5,600),
        (4,22,1,1,800),
        (5,18,7,12,300),
        (6,12,9,15,250);
        
 select *
   from @summarizedtable

我已经多次使用PIVOT,但只有一个“类别”的数据。我似乎无法使用多个类别来坚持下去

【问题讨论】:

做了什么?为什么它不起作用?就个人而言,我建议在更严格的 PIVOT 运算符上使用条件聚合。 【参考方案1】:

我会使用cross apply 取消透视,然后使用条件聚合进行透视:

select x.category,
    sum(case when t.month = 1 then val end) month_1,
    sum(case when t.month = 2 then val end) month_2,
    sum(case when t.month = 3 then val end) month_3,
    sum(case when t.month = 4 then val end) month_4,
    sum(case when t.month = 5 then val end) month_5,
    sum(case when t.month = 6 then val end) month_6
from @summarizedtable t
cross apply (values 
    ('calls', t.calls), 
    ('deals', t.deals), 
    ('productssold', t.productssold),
    ('avgsaleprice', t.avgsaleprice)
) as x(category, val)
group by x.category

Demo on DB Fiddle

类别 |月_1 |月_2 |月_3 |月_4 |月_5 |月_6 :----------- | ------: | ------: | ------: | ------: | ------: | ------: 平均售价 | 500 | 300 | 600 | 800 | 300 | 250 来电 | 25 | 17 | 15 | 22 | 18 | 12 优惠 | 6 | 2 | 3 | 1 | 7 | 9 已售产品 | 7 | 4 | 5 | 1 | 12 | 15

【讨论】:

以上是关于TSQL PIVOT/UNPIVOT 多个汇总列的主要内容,如果未能解决你的问题,请参考以下文章

死磕:SQL行转列汇总(全网最全最详细)

sql的行转列(PIVOT)与列转行(UNPIVOT)

sql的行转列(PIVOT)与列转行(UNPIVOT)

sql的行转列(PIVOT)与列转行(UNPIVOT)

sql的行转列(PIVOT)与列转行(UNPIVOT)

SQL 行转列 列转行 PIVOT UNPIVOT