如何使用CASE语句将指定数据中shortname的汇总从行转列?
用CASE语句实现Shortname汇总结果的列展示(行转列)
这其实是SQL里很常见的行转列需求,用CASE语句配合聚合函数就能轻松实现,我给你一步步拆解说明:
核心思路
我们需要针对每个shortname的具体取值,用CASE语句创建对应的专属列,再通过聚合函数(比如SUM、COUNT)把该shortname下的数值汇总到对应列中,最后按业务需求的维度分组(如果不需要分组就去掉GROUP BY)。
示例代码(静态场景)
假设你的表名为data_table,包含要汇总的数值列(比如amount)、shortname列,还有可能的分组维度(比如category或record_date)。
带分组维度的情况
如果需要按某个维度(比如category)分组展示各shortname的汇总结果:
SELECT category, -- 替换成你实际的分组字段,不需要的话直接删除这行 SUM(CASE WHEN shortname = 'SHT_A' THEN amount ELSE 0 END) AS SHT_A_total, SUM(CASE WHEN shortname = 'SHT_B' THEN amount ELSE 0 END) AS SHT_B_total, SUM(CASE WHEN shortname = 'SHT_C' THEN amount ELSE 0 END) AS SHT_C_total -- 有更多shortname取值就继续添加对应的CASE语句 FROM data_table GROUP BY category;
无分组维度的情况
如果只需要汇总全表所有行的结果:
SELECT SUM(CASE WHEN shortname = 'SHT_A' THEN amount ELSE 0 END) AS SHT_A_total, SUM(CASE WHEN shortname = 'SHT_B' THEN amount ELSE 0 END) AS SHT_B_total, SUM(CASE WHEN shortname = 'SHT_C' THEN amount ELSE 0 END) AS SHT_C_total FROM data_table;
细节补充
- 如果你需要的是计数统计而非求和,把
SUM换成COUNT即可,CASE语句还能简化:
(因为COUNT会忽略NULL值,不符合条件时CASE返回NULL,不会被计入统计)COUNT(CASE WHEN shortname = 'SHT_A' THEN 1 END) AS SHT_A_count - 代码里的
SHT_A、SHT_B要替换成你实际的shortname取值,每个不同的取值都要对应一条CASE语句。 - 如果你的shortname取值是动态变化的(无法提前枚举),静态CASE写法就不太适用了,这时候可以考虑用动态SQL自动生成CASE语句,或者使用数据库自带的PIVOT函数(不同数据库语法略有差异,比如SQL Server的
PIVOT、MySQL的动态拼接)。
内容的提问来源于stack exchange,提问作者Avi Avinash
相关产品推荐
相关产品推荐

