如何展平SQL语句 按客户将指标字段拆分为多列输出
实现思路
你需要做的是典型的行转列(透视)操作:按Customer维度分组,把不同Group对应的Indicator值从行维度拆分到独立列中,最终实现每个客户仅对应一行数据。
通用兼容写法(所有SQL数据库支持)
用CASE WHEN搭配聚合函数实现,不需要依赖数据库专属语法,可直接运行:
SELECT customer, MAX(CASE WHEN `group` = 'One' THEN Indicator END) AS Indicator1, MAX(CASE WHEN `group` = 'Two' THEN Indicator END) AS Indicator2 FROM ( -- 内嵌你原有的查询逻辑 SELECT customer, `group`, CASE WHEN `group` = 'One' THEN 'A' ELSE 'B' END AS Indicator FROM TABLE1 ) t GROUP BY customer;
写法说明
- 用
MAX()作为聚合函数是因为按客户分组后,每个客户对应单个Group值的Indicator只有1个有效值,其余匹配不到的行返回NULL,MAX会自动忽略NULL提取到正确的指标值,也可以用MIN()替代,效果一致。
注意:你原有SQL存在两处容易报错的问题:一是字符串值
One没有加单引号,会被数据库识别为列名;二是group是SQL标准保留字,作为字段名使用时需要用反引号(MySQL/PG等)或方括号(SQL Server)转义。
数据库专属简化写法
如果使用的是支持PIVOT函数的数据库(SQL Server、Oracle、BigQuery等),可以用原生透视语法简化代码,以SQL Server为例:
SELECT customer, One AS Indicator1, Two AS Indicator2 FROM ( SELECT customer, [group], CASE WHEN [group] = 'One' THEN 'A' ELSE 'B' END AS Indicator FROM TABLE1 ) t PIVOT ( MAX(Indicator) FOR [group] IN (One, Two) ) p;
运行结果
上述两种写法最终返回的数据和你给出的目标表完全一致:每个客户一行,Indicator1固定返回Group为One时的'A',Indicator2固定返回Group为Two时的'B'。
内容的提问来源于stack exchange,提问作者B.Win
相关产品推荐
相关产品推荐

