不带聚合功能的SQL中的数据透视

时间:2018-10-09 07:36:48

标签: sql pivot

我有一个类似

的表的场景

表格视图

我想要的输出是

3 个答案:

答案 0 :(得分:1)

如果您的论点是“我将永远只有一个值或没有值,因此我不想要聚合”,请意识到有多个聚合,如果它们仅传递了一个值进行聚合,则会返回该值作为结果。我想到了MINMAXSUM也适用于数字数据。

因此,指定没有聚合的PIVOT的解决方案是在此处指定这种“通过”聚合。

基本上,PIVOT的内部工作原理与GROUP BY相同。除了分组列以外,当前结果集中的所有列 除了PIVOT规范的汇总部分中提到的列之外。就像使用SELECT时使用GROUP BY子句的规则 1 一样, 的每个列都必须是一个分组列或包含在其中聚集。


1 抱怨,抱怨,年长的抱怨。尽管默认值从5.7.5起更为合理。

答案 1 :(得分:0)

尝试一下:

Demo

with cte1 as
(
select 'Web' as platformname,'abc' as productname,'A' as grade
union all
select 'Web' ,'cde' ,'B'
union all
select 'IOS' ,'xyz' ,'C'
union all
select 'MAX' ,'cde' ,'D'
)
select  productname,[Web], [IOS], [Android],[Universal],[Mac],[Win32]
from    cte1 t
        pivot
        (
            max(grade)
            for platformname in ([Web], [IOS], [Android],[Universal],[Mac],[Win32])
        ) p

答案 2 :(得分:0)

您可以使用join s来“透视”这些数据:

select p.productname,
       t_win32.grade as win32,
       t_universal.grade as universal,
       . . .
from products p left join -- assume you have such a table
     t t_win32
     on t_win32.product_name = p.productname and t_win32.platform = 'Win32' left join
     t t_universal
     on t_universal.product_name = p.productname and t_universal.platform = 'Universal'  left join
     . . . 

如果没有表products,请改用派生表:

from (select distinct product_name from t) p left join
     . . .