SQL 中的透视/反透视
Posted
技术标签:
【中文标题】SQL 中的透视/反透视【英文标题】:Pivot / unpivot in SQL 【发布时间】:2009-10-19 22:21:02 【问题描述】:我有一个 SQL 视图,它是通过分析表中的值生成的,因此该字段包含值“N”、“D”或“V”。我可以按列计算总数,但不能按行计算……这可能吗?
例子:
数据
No, Col_1, Col_2, Col_3
1, N, N, N
2, N, D, D
3, N, V, D
4, V, V, V
我如何总结第 3 行有 1N、1V 和 3ds 而第 4 行有 4Vs?
赌注很简单,可惜我也一样!
提前非常感谢, 彼得
【问题讨论】:
【参考方案1】: select case when col_1 = 'N' then 1 else 0 end as n_count from tablename;
概括:
select
case when col_1 = 'N' then 1 else 0 end
+ case when col_2 = 'N' then 1 else 0 end
+ case when col_2 = 'N' then 1 else 0 end as n_count,
case when col_1 = 'V' then 1 else 0 end
+ case when col_2 = 'V' then 1 else 0 end
+ case when col_2 = 'V' then 1 else 0 end as v_count,
....
from tablename;
【讨论】:
除非列数是动态的......然后你做一个 PIVOT @d03boy:据我所知,仅 SQL Server 2005+ 和 Oracle 11g+ 支持 PIVOT 语法。恕我直言,CASE 语句更容易动态生成。【参考方案2】:怎么样?
select no,
sum(case when val = 'N' then 1 else 0 end) ncnt,
sum(case when val = 'V' then 1 else 0 end) vcnt,
sum(case when val = 'D' then 1 else 0 end) dcnt from
(select no, col_1 val from t union all
select no, col_2 from t union all
select no, col_3 from t)
group by no
order by no
【讨论】:
以上是关于SQL 中的透视/反透视的主要内容,如果未能解决你的问题,请参考以下文章