如何使用数据透视在 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 中将行转换为列的主要内容,如果未能解决你的问题,请参考以下文章

这是一个员工数据,我想使用数据透视将行数据转换为列

在 Tableau 中反透视数据 将行转换为列

在 SQL 中将行转换为列

在没有聚合的 SQL 中将行透视到列

如何在 SQL 中将行转换为列值 [关闭]

在 Oracle SQL 中将数据透视表转换为平面表