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

SQL Server中多列转多行的技术实现求助

别急,我来帮你搞定这个SQL Server列转行的问题!虽然你没贴出具体的截图,但我先基于常见的场景给你举例子,你可以对照自己的实际表结构调整~

解决方案:列转行+自定义Type字段

先模拟你的场景(如果和实际不符,直接替换成你的表结构即可)

假设你的源表叫SourceData,结构大概是这样:

IDScoreMathScoreEnglishScoreScience
1859278
2908895

你想要的目标表是把科目列转成行,同时新增Type字段对应科目类型(比如Math对应'M',English对应'E',Science对应'S'):

IDTypeScore
1M85
1E92
1S78
2M90
2E88
2S95

方法一:UNION ALL(直观易懂,适合列数少的场景)

这种方法逻辑最简单,就是把每一列单独查询出来再合并,同时指定对应的Type:

SELECT 
    ID,
    'M' AS Type,
    ScoreMath AS Score
FROM SourceData
UNION ALL
SELECT 
    ID,
    'E' AS Type,
    ScoreEnglish AS Score
FROM SourceData
UNION ALL
SELECT 
    ID,
    'S' AS Type,
    ScoreScience AS Score
FROM SourceData
ORDER BY ID, Type;

方法二:UNPIVOT(简洁高效,适合列数多的场景)

如果你的源表有很多列,用UNION ALL会很繁琐,这时候用UNPIVOT更合适,还可以结合CASE语句自定义Type:

SELECT 
    ID,
    -- 这里用CASE把原来的列名转成你需要的Type值
    CASE UnpivotCol
        WHEN 'ScoreMath' THEN 'M'
        WHEN 'ScoreEnglish' THEN 'E'
        WHEN 'ScoreScience' THEN 'S'
    END AS Type,
    Score
FROM SourceData
UNPIVOT (
    -- 定义转成行后的数值列名(这里是Score)
    Score FOR UnpivotCol IN (ScoreMath, ScoreEnglish, ScoreScience)
) AS UnpivotResult
ORDER BY ID, Type;

补充:如果Type字段有特殊规则(不是对应列名)

如果你的Type不是基于原列名,而是根据值的其他逻辑(比如分数区间),可以直接在SELECT里调整CASE:

SELECT 
    ID,
    CASE 
        WHEN Score >= 90 THEN 'Excellent'
        WHEN Score >= 80 THEN 'Good'
        ELSE 'Pass'
    END AS Type,
    Score
FROM SourceData
UNPIVOT (
    Score FOR UnpivotCol IN (ScoreMath, ScoreEnglish, ScoreScience)
) AS UnpivotResult
ORDER BY ID, Type;

哦对了,你之前提到用CASE-WHEN结合PIVOT没成功,应该是搞反了:PIVOT是行转列,UNPIVOT才是列转行,所以换用UNPIVOT或者UNION ALL就对啦!

如果你的实际表结构和Type规则和我模拟的不一样,把具体的列名和规则告诉我,我再帮你调整~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:39:06