如何转置数据?MS SQL 2008中能否用PIVOT/UNPIVOT将表数据转为单行?
多行转单行?用PIVOT完全可以实现!
首先明确:PIVOT就是用来做行转列(把多行数据转成单行多列)的,正好匹配你的需求;而UNPIVOT是反过来的列转行操作,所以不适合你现在的场景。
结合MS SQL 2008的特性,我给你举个实际例子(假设你的表结构是常见的分组+类别+值的形式,如果你实际表结构不同,可以调整逻辑):
首先模拟创建测试表和数据:
CREATE TABLE YourTable ( GroupID INT, ItemName VARCHAR(50), ItemValue INT ); INSERT INTO YourTable VALUES (1, '销售额', 10000), (1, '成本', 6000), (1, '利润', 4000), (2, '销售额', 15000), (2, '成本', 8000);
现在要把每个GroupID对应的多行数据转成单行,用PIVOT的写法如下:
SELECT GroupID, 销售额, 成本, 利润 FROM ( -- 源数据子查询,指定要用到的列 SELECT GroupID, ItemName, ItemValue FROM YourTable ) AS SourceData PIVOT ( -- 聚合函数:因为PIVOT需要对分组后的数据做聚合,如果每个GroupID+ItemName唯一,用MAX/MIN都可以 MAX(ItemValue) -- 指定要转成列的字段,以及具体的列值(必须明确列出) FOR ItemName IN (销售额, 成本, 利润) ) AS PivotResult;
执行后你会得到这样的结果:
| GroupID | 销售额 | 成本 | 利润 |
|---|---|---|---|
| 1 | 10000 | 6000 | 4000 |
| 2 | 15000 | 8000 | NULL |
针对MS SQL 2008的注意事项:
- 必须使用聚合函数:PIVOT的逻辑是先分组,再对指定字段聚合后转列,所以哪怕你的数据是唯一的,也得加
MAX/MIN这类函数 - 列值必须明确指定:MS SQL 2008的PIVOT不支持动态生成列名,如果你的
ItemName是动态的,需要用动态SQL拼接语句 - 如果你的原始表结构不是分组+类别+值的形式,比如是多行重复ID的多列数据,也可以先通过UNPIVOT把列转成行,再用PIVOT转回来成单行,不过这种场景比较少见
如果你的实际表结构和我假设的不一样,可以把创建表和数据的代码贴出来,我再帮你调整具体的SQL语句~
内容的提问来源于stack exchange,提问作者roman
相关产品推荐
相关产品推荐

