SQL Server:多行数据转换为单行输出实现指导请求
解决行转列需求:将同一客户的多属性条目转为横向列
嘿,我来帮你搞定这个把多行数据转成横向多列的需求!先明确下你的数据和目标:
原始数据
| C_ID | A_ID | A_VAL | UPDATE_DATE |
|---|---|---|---|
| 83181064 | BDAY | 2004 | 2021-08-26 |
| 83181064 | ANNIV | 2021-08-23 | 2021-08-23 |
| 83181064 | EXPR | 2006 | 2021-08-23 |
期望输出
| C_ID | A_ID_B | A_VAL_B | UPDATE_DATE_B | A_ID_N | A_VAL_N | UPDATE_DATE_N | A_ID_M | A_VAL_M | UPDATE_DATE_M |
|---|---|---|---|---|---|---|---|---|---|
| 83181064 | BDAY | 2004 | 2021-08-26 | ANNIV | 2021-08-23 | 2021-08-23 | EXPR | 2006 | 2021-08-23 |
通用SQL解决方案(适用于MySQL、PostgreSQL、SQL Server等多数数据库)
这个方案用条件聚合实现,思路是针对每个A_ID类型,提取对应的字段值,最后按C_ID分组合并成一行:
SELECT C_ID, -- 提取BDAY对应的字段 MAX(CASE WHEN A_ID = 'BDAY' THEN A_ID END) AS A_ID_B, MAX(CASE WHEN A_ID = 'BDAY' THEN A_VAL END) AS A_VAL_B, MAX(CASE WHEN A_ID = 'BDAY' THEN UPDATE_DATE END) AS UPDATE_DATE_B, -- 提取ANNIV对应的字段 MAX(CASE WHEN A_ID = 'ANNIV' THEN A_ID END) AS A_ID_N, MAX(CASE WHEN A_ID = 'ANNIV' THEN A_VAL END) AS A_VAL_N, MAX(CASE WHEN A_ID = 'ANNIV' THEN UPDATE_DATE END) AS UPDATE_DATE_N, -- 提取EXPR对应的字段 MAX(CASE WHEN A_ID = 'EXPR' THEN A_ID END) AS A_ID_M, MAX(CASE WHEN A_ID = 'EXPR' THEN A_VAL END) AS A_VAL_M, MAX(CASE WHEN A_ID = 'EXPR' THEN UPDATE_DATE END) AS UPDATE_DATE_M FROM your_table_name -- 替换成你的实际表名 GROUP BY C_ID;
代码说明:
CASE WHEN会筛选出当前A_ID类型的对应值,其他行返回NULLMAX()聚合函数用来过滤掉NULL值,因为同一个C_ID下每个A_ID只有一条数据,用MIN()也能达到同样效果GROUP BY C_ID确保同一个客户的所有行被合并成一行
如果后续有更多A_ID类型(比如新增其他属性),只需要复制对应的CASE WHEN块,修改A_ID判断条件和列名即可。
内容的提问来源于stack exchange,提问作者shruti M
相关产品推荐
相关产品推荐

