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 中的透视/反透视的主要内容,如果未能解决你的问题,请参考以下文章

SQL 透视/反透视

SQL Server 中的反透视表

Databricks/Spark SQL 中的反透视表

spark-sql/Scala 中的反透视列名是数字

SQL 透视/反透视?

PostgreSQL 中的反透视表