如何在SQL Server中将行数据转换为列格式?
在SQL Server中将行数据转置为指定列格式的查询方法
原表结构及数据
| BatchAddID | BatchID | Description | Actual |
|---|---|---|---|
| 1 | 1 | Chemical 1 | 10 |
| 2 | 1 | Chemical 2 | 11 |
| 3 | 2 | Chemical 1 | 20 |
| 4 | 2 | Chemical 2 | 21 |
期望结果
| BatchID | Chemical 1 Actual | Chemical 2 Actual |
|---|---|---|
| 1 | 10 | 11 |
| 2 | 20 | 21 |
下面提供两种可行的查询方法,都能得到你想要的结果:
方法1:CASE表达式+聚合函数
这种方法逻辑直观,适合已知要转置的具体类别(比如这里明确是Chemical 1和Chemical 2)的场景,兼容性也更好:
SELECT BatchID, MAX(CASE WHEN Description = 'Chemical 1' THEN Actual END) AS [Chemical 1 Actual], MAX(CASE WHEN Description = 'Chemical 2' THEN Actual END) AS [Chemical 2 Actual] FROM YourTableName -- 替换成你的实际表名 GROUP BY BatchID;
原理:用CASE语句筛选出对应化学品的实际值,再通过聚合函数(MAX/MIN/SUM都可以,这里因为每个BatchID+Description组合唯一,所以任意聚合函数都能得到正确值)将同一BatchID的多行数据合并为一行。
方法2:使用PIVOT运算符
SQL Server提供的PIVOT是专门用于行转列的语法,写法更简洁:
SELECT BatchID, [Chemical 1] AS [Chemical 1 Actual], [Chemical 2] AS [Chemical 2 Actual] FROM YourTableName -- 替换成你的实际表名 PIVOT ( MAX(Actual) FOR Description IN ([Chemical 1], [Chemical 2]) ) AS PivotTable;
原理:PIVOT子句中指定要聚合的字段(Actual),通过FOR Description IN (...)指定要转成列的具体类别,最后给转置后的结果表起别名即可。
如果后续化学品的种类可能动态增加,需要自动生成列的话,可以使用动态SQL实现,但如果是固定的几个类别,上面两种方法完全够用。
内容的提问来源于stack exchange,提问作者dlp
相关产品推荐
相关产品推荐

