使用PIVOT进行行转列未得到正确结果的求助
PIVOT进行行转列未得到正确结果的求助
各位好,我最近在做行转列的操作,想用PIVOT来实现,但出来的结果和预期的不一样,想请大家帮忙看看问题出在哪。
我的原始表格数据是这样的:
| ColA | ColB | ColC | ColD | ColE | ColF |
|---|---|---|---|---|---|
| ABCD | EFGH | HIJK | R111 | HIJK | 20 |
| ABCD | EFGH | XXXX | R111 | XXXX | 30 |
| ABCD | EFGH | XXXX | R112 | YYYY | 40 |
| ABCD | EFGH | zzzz | R112 | zzzz | 50 |
我想要的最终结果是这样的:
| ColA | ColB | ColC | R111 | R112 |
|---|---|---|---|---|
| ABCD | EFGH | HIJK | 20 | |
| ABCD | EFGH | XXXX | 30 | 40 |
| ABCD | EFGH | zzzz | 50 |
我尝试用PIVOT来转换,但结果总是不对,有没有大佬能帮我写出正确的SQL语句?
解决方案示例
如果是支持PIVOT语法的数据库(比如SQL Server),可以这样写:
SELECT ColA, ColB, ColC, R111, R112 FROM ( -- 子查询只保留需要用到的字段:分组字段、行转列的标识字段、值字段 SELECT ColA, ColB, ColC, ColD, ColF FROM YourTableName ) AS SourceData PIVOT ( -- 因为每组(ColA,ColB,ColC,ColD)对应唯一的ColF,用MAX/SUM都可以 MAX(ColF) -- 指定要转成列的ColD值 FOR ColD IN ([R111], [R112]) ) AS PivotResult;
如果是像MySQL这类没有内置PIVOT的数据库,可以用CASE WHEN结合分组来实现:
SELECT ColA, ColB, ColC, -- 当ColD是R111时取ColF的值,否则为空,用MAX聚合去掉空值 MAX(CASE WHEN ColD = 'R111' THEN ColF END) AS R111, MAX(CASE WHEN ColD = 'R112' THEN ColF END) AS R112 FROM YourTableName -- 按分组字段分组 GROUP BY ColA, ColB, ColC;
需要注意的是,这里的核心是正确选择分组字段(ColA、ColB、ColC),以及用聚合函数处理每个分组下的对应值。因为PIVOT本质上是聚合+列转换,所以必须指定合适的聚合函数,这里你的数据每个分组下对应唯一值,所以MAX/SUM都能得到正确结果。
备注:内容来源于stack exchange,提问作者Mayur Ghanekar
相关产品推荐
相关产品推荐

