Oracle Turn Table就此而言

时间:2014-06-05 23:37:57

标签: sql oracle plsql pivot

感谢您提前提供任何帮助,因为我似乎无法弄明白。

我正在运行Oracle DB的第11版。我所拥有的是下表(PO_INFO_DATA):

PO_NUMBER  |  INFO_ID  |  INFO_DATA  |

每个PO_NUMBER最多可分配40个INFO_ID,从1到40,每个INFO_ID将具有相应的INFO_DATA。 所以,例如,

PO_NUMBER | INFO_ID |  INFO_DATA    | 
-------------------------------------
500000    |     1   |      DRAMA    | 
500000    |     2   |      BELT     | 
500000    |     3   |      SPANDEX  | 
500001    |     1   |      34572    | 
500001    |     2   |      BONGO    | 
500001    |     3   |      POLYESTER| 

等等。

我想要做的是以这种格式显示它:

PO_NUMBER | INFO_DATA_1 | INFO_DATA_2 | INFO_DATA_3 | ... and so on till INFO_DATA_40

我试过了:

SELECT
    PO_NUMBER, 
    DECODE (INFO_ID, 1, INFO_DATA) INFO_DATA_1, 
    DECODE (INFO_ID, 2, INFO_DATA) INFO_DATA_2, 
    DECODE (INFO_ID, 3, INFO_DATA) INFO_DATA_3, 
    DECODE (INFO_ID, 4, INFO_DATA) INFO_DATA_4, 
    DECODE (INFO_ID, 5, INFO_DATA) INFO_DATA_5, 
    DECODE (INFO_ID, 6, INFO_DATA) INFO_DATA_6, 
    DECODE (INFO_ID, 7, INFO_DATA) INFO_DATA_7, 
    DECODE (INFO_ID, 8, INFO_DATA) INFO_DATA_8, 
    DECODE (INFO_ID, 9, INFO_DATA) INFO_DATA_9, 
    DECODE (INFO_ID, 10, INFO_DATA) INFO_DATA_10, 
    DECODE (INFO_ID, 11, INFO_DATA) INFO_DATA_11, 
    DECODE (INFO_ID, 12, INFO_DATA) INFO_DATA_12, 
    DECODE (INFO_ID, 13, INFO_DATA) INFO_DATA_13, 
    DECODE (INFO_ID, 14, INFO_DATA) INFO_DATA_14, 
    DECODE (INFO_ID, 15, INFO_DATA) INFO_DATA_15, 
    DECODE (INFO_ID, 16, INFO_DATA) INFO_DATA_16, 
    DECODE (INFO_ID, 17, INFO_DATA) INFO_DATA_17, 
    DECODE (INFO_ID, 18, INFO_DATA) INFO_DATA_18, 
    DECODE (INFO_ID, 19, INFO_DATA) INFO_DATA_19, 
    DECODE (INFO_ID, 20, INFO_DATA) INFO_DATA_20, 
    DECODE (INFO_ID, 21, INFO_DATA) INFO_DATA_21, 
    DECODE (INFO_ID, 22, INFO_DATA) INFO_DATA_22, 
    DECODE (INFO_ID, 23, INFO_DATA) INFO_DATA_23, 
    DECODE (INFO_ID, 24, INFO_DATA) INFO_DATA_24, 
    DECODE (INFO_ID, 25, INFO_DATA) INFO_DATA_25, 
    DECODE (INFO_ID, 26, INFO_DATA) INFO_DATA_26, 
    DECODE (INFO_ID, 27, INFO_DATA) INFO_DATA_27, 
    DECODE (INFO_ID, 28, INFO_DATA) INFO_DATA_28, 
    DECODE (INFO_ID, 29, INFO_DATA) INFO_DATA_29, 
    DECODE (INFO_ID, 30, INFO_DATA) INFO_DATA_30, 
    DECODE (INFO_ID, 31, INFO_DATA) INFO_DATA_31, 
    DECODE (INFO_ID, 32, INFO_DATA) INFO_DATA_32, 
    DECODE (INFO_ID, 33, INFO_DATA) INFO_DATA_33, 
    DECODE (INFO_ID, 34, INFO_DATA) INFO_DATA_35, 
    DECODE (INFO_ID, 35, INFO_DATA) INFO_DATA_35, 
    DECODE (INFO_ID, 36, INFO_DATA) INFO_DATA_36, 
    DECODE (INFO_ID, 37, INFO_DATA) INFO_DATA_37, 
    DECODE (INFO_ID, 38, INFO_DATA) INFO_DATA_38, 
    DECODE (INFO_ID, 39, INFO_DATA) INFO_DATA_39, 
    DECODE (INFO_ID, 40, INFO_DATA) INFO_DATA_40 
    FROM 
        PO_INFO_DATA 
    ORDER BY PO_NUMBER ;

它有点工作,因为它确实将表放在一边,但它在输出中创建了多行:

PO_NUMBER | INFO_DATA_1 | INFO_DATA_2 | INFO_DATA_3.....
500000    | DRAMA       |             |
500000    |             | BELT        |
500000    |             |             | SPANDEX
500001    | 34572       |             |
500001    |             | BONGO       |
500001    |             |             | POLYESTER

我不希望此表有多个单独的行。每个PO应该只有一行。请帮我正确重建我的查询。

1 个答案:

答案 0 :(得分:1)

我认为你正在寻找类似的东西:

    SELECT   po_number,
             MAX (DECODE (info_id, 1, info_data, NULL)) INFO_DATA_1,
             MAX (DECODE (info_id, 2, info_data, NULL)) INFO_DATA_2,
             MAX (DECODE (info_id, 3, info_data, NULL)) INFO_DATA_3,
             ...
        FROM po_info_data
        group by po_number
        Order by po_number;

只需添加所有可能的情况,直至INFO_DATA_40。

请注意,此解决方案不灵活,因为它假设您最多可以有40列,这意味着info_id列的最大值可以为40。