【问题标题】:Oracle 11g SQL: Pivot Table -- Variable number of columnsOracle 11g SQL:数据透视表——可变列数
【发布时间】:2014-05-31 04:26:02
【问题描述】:

我正在尝试获取一个表格并将两列的值转换为它们自己的列。扭曲是每个锚点可以有可变数量的条目。这是一个玩具桌:

    CREATE TABLE ATTRS
    ( WIDGET VARCHAR2(15), 
      A_NAME VARCHAR2(15), 
      A_VALUE VARCHAR2(15)
     );
    INSERT INTO ATTRS VALUES ('BOOK','PAGES','1000');
    INSERT INTO ATTRS VALUES ('BOOK','COLOR','GREEN');
    INSERT INTO ATTRS VALUES ('BOOK','LAST','TWAIN');
    INSERT INTO ATTRS VALUES ('BOOK','FIRST','MARK');
    INSERT INTO ATTRS VALUES ('CELLPHONE','BRAND','SAMSUNG');
    INSERT INTO ATTRS VALUES ('LAPTOP','BRAND','LENOVO');
    INSERT INTO ATTRS VALUES ('LAPTOP','COLOR','BLACK');
    INSERT INTO ATTRS VALUES ('LAPTOP','BATTERY','STANDARD');

我会知道可能出现的唯一 A_NAME 的最大数量(在本例中我们将其设为 4)并希望输出如下:

    WIDGET    | A_NAME1 | A_VALUE1 | A_NAME2 | A_VALUE2 | A_NAME3 | A_VALUE3   | A_NAME4 | A_VALUE4
    ------------------------------------------------------------------------------------------
    BOOK      | PAGES   | '1000'   | COLOR   | 'GREEN'  | LAST    | 'TWAIN'    | FIRST   | 'MARK'
    CELLPHONE | BRAND   | 'SAMSUNG'| (null)  | (null)   | (null)  | (null)     | (null)  | (null) 
    LAPTOP    | COLOR   | 'BLACK'  | BRAND   | 'LENOVO' | BATTERY | 'STANDARD' | (null)  | (null) 

请注意,顺序无关紧要,即如果两个 A_NAME 相同,则它们需要在同一列中。

谢谢。

【问题讨论】:

    标签: sql oracle oracle11g pivot


    【解决方案1】:

    我不得不考虑一下如何使用新的(在 11g 中)pivot 运算符来完成此操作。但是,知道每个 widget 最多有 4 行,您可以按照以下方式做一个老式的支点

    SELECT widget,
           max(CASE WHEN rn = 1 THEN a_name ELSE NULL END) a_name1,
           max(CASE WHEN rn = 1 THEN a_value ELSE NULL END) a_value1,
           max(CASE WHEN rn = 2 THEN a_name ELSE NULL END) a_name2,
           max(CASE WHEN rn = 2 THEN a_value ELSE NULL END) a_value2,
           max(CASE WHEN rn = 3 THEN a_name ELSE NULL END) a_name3,
           max(CASE WHEN rn = 3 THEN a_value ELSE NULL END) a_value3,
           max(CASE WHEN rn = 4 THEN a_name ELSE NULL END) a_name4,
           max(CASE WHEN rn = 4 THEN a_value ELSE NULL END) a_value4
      FROM( SELECT widget,
                   a_name,
                   a_value,
                   row_number() over (partition by widget 
                                          order by a_name, a_value) rn
              FROM attrs )
     GROUP BY widget
    

    【讨论】:

    • 谢谢!现在可以了,如果你真的想出它,我很想看看你如何使用 PIVOT 来完成它。
    猜你喜欢
    • 1970-01-01
    • 2018-02-19
    • 2014-07-05
    • 1970-01-01
    • 1970-01-01
    • 2018-03-27
    • 2021-07-02
    • 2018-11-16
    • 1970-01-01
    相关资源
    最近更新 更多