如何转置SQL表TEST-TABLE并统计各动物对应条目的出现次数?
解决方案:逆透视+分组统计
要实现需求,核心是先把Digested和Played with两列的行数据转换为统一的列条目(逆透视),再按动物和条目分组统计出现次数。
方法1:通用SQL(适配所有支持UNION ALL的数据库)
通过UNION ALL将两列的所有值合并到一个新列(命名为Item),再分组计数:
SELECT Animal, Item, COUNT(*) AS Count FROM ( -- 提取Digested列的所有条目 SELECT Animal, Digested AS Item FROM TEST-TABLE UNION ALL -- 提取Played with列的所有条目(注意空格列名要用方括号/双引号包裹) SELECT Animal, [Played with] AS Item FROM TEST-TABLE ) AS UnpivotedData -- 可选:过滤空值条目 WHERE Item IS NOT NULL GROUP BY Animal, Item ORDER BY Animal, Count DESC;
方法2:使用UNPIVOT函数(适用于SQL Server、Oracle等支持的数据库)
如果你的数据库支持UNPIVOT语法,可更简洁地完成逆透视:
SELECT Animal, Item, COUNT(*) AS Count FROM TEST-TABLE UNPIVOT ( Item FOR Activity IN (Digested, [Played with]) ) AS UnpivotedData WHERE Item IS NOT NULL GROUP BY Animal, Item ORDER BY Animal, Count DESC;
注意事项
- 列名
Played with包含空格,SQL中需用方括号[](SQL Server)或双引号""(Oracle、PostgreSQL)包裹,避免语法错误。 - 若不需要排除空值条目,可去掉
WHERE Item IS NOT NULL语句。 - 最终结果会按动物分组,统计每个条目在
Digested和Played with两列中的总出现次数,与目标表结构一致。
内容的提问来源于stack exchange,提问作者MaxPower8993
相关产品推荐
相关产品推荐

