如何使用数据透视在 Oracle 中将行转换为列
Posted
技术标签:
【中文标题】如何使用数据透视在 Oracle 中将行转换为列【英文标题】:How to Convert Rows to Columns in Oracle using pivot 【发布时间】:2020-02-26 14:36:47 【问题描述】:我有桌子
id year quarter total
1 2016 1 100
1 2016 2 200
1 2016 3 300
1 2016 4 400
2 2016 1 100
2 2016 2 200
我想得到输出:
id year total1 total2 total3 total4
1 2016 100 200 300 400
2 2016 100 200
我试过了
SELECT year,
"1" AS total1,
"2" AS total2,
"3" AS total3,
"4" AS total4
FROM (SELECT
*
FROM mytable
PIVOT (... FOR quarter IN (1, 2, 3, 4))
where year=2016) a
;
【问题讨论】:
这是一个需要使用PIVOT
运算符的家庭作业吗?这不是我要走的路(我会像发布的答案一样使用条件聚合),但如果你必须使用PIVOT
,你必须使用PIVOT
。
对不起,我不想要 max 或 sum 任何值。我只是想将每个季度的总计值作为新列输出
您不了解代码的工作原理。在关闭它之前尝试一下。
如果您使用 max(total)
或 sum(total)
而不是点,则您的查询 works。 Pivot 需要聚合,但在这种情况下,它将为每个 id
创建行。问题是如果同一季度有两行具有相同 ID,该怎么办。您想要总和、最大值还是单独的行?
【参考方案1】:
你可以做聚合:
SELECT id, year,
SUM(CASE WHEN quarter = 1 THEN total ELSE 0 END) AS total1,
SUM(CASE WHEN quarter = 2 THEN total ELSE 0 END) AS total2,
SUM(CASE WHEN quarter = 3 THEN total ELSE 0 END) AS total3,
SUM(CASE WHEN quarter = 4 THEN total ELSE 0 END) AS total4
FROM mytable
GROUP BY id, year;
【讨论】:
【参考方案2】:假设您正在寻找 pivot() 函数的用法,请尝试以下操作:
SELECT id,
year,
"1_TOTAL" AS total1,
"2_TOTAL" AS total2,
"3_TOTAL" AS total3,
"4_TOTAL" AS total4
FROM (SELECT * FROM mytable) PIVOT (SUM (total) AS total
FOR (quarter)
IN (1, 2, 3, 4));
注意:该问题并未说明您要查找的是 sum() 还是 max()。对于您提供的所需输出,您可以使用 sum() 或 max()
【讨论】:
以上是关于如何使用数据透视在 Oracle 中将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章