You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL Server:多行数据转换为单行输出实现指导请求

解决行转列需求:将同一客户的多属性条目转为横向列

嘿,我来帮你搞定这个把多行数据转成横向多列的需求!先明确下你的数据和目标:

原始数据

C_IDA_IDA_VALUPDATE_DATE
83181064BDAY20042021-08-26
83181064ANNIV2021-08-232021-08-23
83181064EXPR20062021-08-23

期望输出

C_IDA_ID_BA_VAL_BUPDATE_DATE_BA_ID_NA_VAL_NUPDATE_DATE_NA_ID_MA_VAL_MUPDATE_DATE_M
83181064BDAY20042021-08-26ANNIV2021-08-232021-08-23EXPR20062021-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类型的对应值,其他行返回NULL
  • MAX()聚合函数用来过滤掉NULL值,因为同一个C_ID下每个A_ID只有一条数据,用MIN()也能达到同样效果
  • GROUP BY C_ID确保同一个客户的所有行被合并成一行

如果后续有更多A_ID类型(比如新增其他属性),只需要复制对应的CASE WHEN块,修改A_ID判断条件和列名即可。


内容的提问来源于stack exchange,提问作者shruti M

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.01 02:02:29