【问题标题】:How to use query for Oracle pivot?如何使用 Oracle 数据透视查询?
【发布时间】:2020-09-24 10:59:04
【问题描述】:

我有如下四列。

我能得到这样的东西吗?

谢谢

【问题讨论】:

  • 嗯……你可以试试。 Chris Saxon 有一篇关于枢轴的优秀文章:blogs.oracle.com/sql/…。看看它,看看它是否符合您的要求。

标签: sql oracle oracle11g pivot pivot-table


【解决方案1】:

我会推荐条件聚合。它是一种独立于数据库的语法,比 Oracle 特有的pivot 语法更灵活:

select
    piece_id,
    max(case when attrb_code = 'A' then attrb_a_value end) a,
    max(case when attrb_code = 'B' then attrb_a_value end) b,
    max(case when attrb_code = 'C' then attrb_a_value end) c,
    max(case when attrb_code = 'D' then attrb_b_value end) d
from mytable
group by piece_id

【讨论】:

    【解决方案2】:

    只需在PIVOT 中使用COALESCE(或NVL):

    SELECT *
    FROM   table_name
    PIVOT (
      MAX( COALESCE( attrb_a_value, attrb_b_value ) )
      FOR attrb_code IN (
        'A' AS A,
        'B' AS B,
        'C' AS C,
        'D' AS D
      )
    )
    

    因此,对于您的示例数据:

    CREATE TABLE table_name ( piece_id, attrb_code, attrb_a_value, attrb_b_value ) AS
    SELECT 22333, 'A', 8, NULL FROM DUAL UNION ALL
    SELECT 22333, 'B', 9, NULL FROM DUAL UNION ALL
    SELECT 22333, 'C', 4, NULL FROM DUAL UNION ALL
    SELECT 22333, 'D', NULL, 5 FROM DUAL UNION ALL
    SELECT 22332, 'A', 2, NULL FROM DUAL UNION ALL
    SELECT 22332, 'B', 3, NULL FROM DUAL UNION ALL
    SELECT 22332, 'C', 7, NULL FROM DUAL UNION ALL
    SELECT 22332, 'D', NULL, 5 FROM DUAL
    

    这个输出:

    PIECE_ID |一个 |乙| C | D --------: | -: | -: | -: | -: 22333 | 8 | 9 | 4 | 5 22332 | 2 | 3 | 7 | 5

    db小提琴here

    【讨论】:

      猜你喜欢
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2013-10-18
      • 2021-06-29
      • 2018-11-05
      相关资源
      最近更新 更多