答案 0 :(得分:1)
如果您的论点是“我将永远只有一个值或没有值,因此我不想要聚合”,请意识到有多个聚合,如果它们仅传递了一个值进行聚合,则会返回该值作为结果。我想到了MIN
和MAX
。 SUM
也适用于数字数据。
因此,指定没有聚合的PIVOT
的解决方案是在此处指定这种“通过”聚合。
基本上,PIVOT
的内部工作原理与GROUP BY
相同。除了分组列以外,当前结果集中的所有列 除了PIVOT
规范的汇总部分中提到的列之外。就像使用SELECT
时使用GROUP BY
子句的规则 1 一样, 的每个列都必须是一个分组列或包含在其中聚集。
1 抱怨,抱怨,年长的mysql抱怨。尽管默认值从5.7.5起更为合理。
答案 1 :(得分:0)
尝试一下:
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
. . .