SQL Server中多列转多行的技术实现求助
别急,我来帮你搞定这个SQL Server列转行的问题!虽然你没贴出具体的截图,但我先基于常见的场景给你举例子,你可以对照自己的实际表结构调整~
解决方案:列转行+自定义Type字段
先模拟你的场景(如果和实际不符,直接替换成你的表结构即可)
假设你的源表叫SourceData,结构大概是这样:
| ID | ScoreMath | ScoreEnglish | ScoreScience |
|---|---|---|---|
| 1 | 85 | 92 | 78 |
| 2 | 90 | 88 | 95 |
你想要的目标表是把科目列转成行,同时新增Type字段对应科目类型(比如Math对应'M',English对应'E',Science对应'S'):
| ID | Type | Score |
|---|---|---|
| 1 | M | 85 |
| 1 | E | 92 |
| 1 | S | 78 |
| 2 | M | 90 |
| 2 | E | 88 |
| 2 | S | 95 |
方法一: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
相关产品推荐
相关产品推荐

