将查询nxn的结果转换为列 - ORACLE

时间:2015-04-07 13:35:55

标签: oracle plsql pivot

我遇到了一个问题,我不知道如何解决它。

我有以下结构:

  • 表PIECE
  • 表PIECE_CHARACTHERISTIC
  • 表格特征

表PIECE_CHARACTHERISTIC在PIECE和CHARACTERISTIC之间建立NxN关系。

所以,一件可以有很多特点。 我需要使用其中一些特征并将它们显示为查询结果中的列:

SELECT PC.CHARACTERISTIC_ID, PC.CHAR_VALUE FROM PIECE P
INNER JOIN PIECE_CHARACTHERISTIC PC ON P.PIECE_ID = PC.PIECE_ID
WHERE 
    PC.CHARACTERISTIC_ID = 1 OR
    PC.CHARACTERISTIC_ID = 2 OR
    PC.CHARACTERISTIC_ID = 3;

作为此查询的结果,我有这样的事情:

PIECE     CHARACTERISTIC_ID    CHAR_VALUE
  P1              1                A
  P1              2                B
  P1              3                C
  P2              1                D
  P2              2                E
  P3              1                X
  ...

我希望结果如下:

PIECE     CHAR_1     CHAR_2   CHAR_3
 P1         A          B        C
 P2         D          E        NULL
 P3         X          NULL     NULL

恢复,我想将许多列中的一列特征的结果转换为该片段的每个特征的值。 非常感谢你的帮助!!

2 个答案:

答案 0 :(得分:0)

这应该有效,你只需要为每一列特征添加左连接

SELECT 
     P.PIECE_ID, 
     PC1.CHAR_VALUE AS CHAR_1, 
     PC2.CHAR_VALUE AS CHAR_2, 
     PC3.CHAR_VALUE AS CHAR_3
FROM PIECE P 
LEFT JOIN PIECE_CHARACTHERISTIC PC1
ON PC1.PIECE_ID = P.PIECE_ID AND PC1.CHARACTERISTIC_ID = 1
LEFT JOIN PIECE_CHARACTHERISTIC PC2
ON PC2.PIECE_ID = P.PIECE_ID AND PC1.CHARACTERISTIC_ID = 2
LEFT JOIN PIECE_CHARACTHERISTIC PC3
ON PC3.PIECE_ID = P.PIECE_ID AND PC1.CHARACTERISTIC_ID = 3

答案 1 :(得分:0)

你可以试试这个。它有点难看,但应该有用。

with
A as ( 
    select PIECE, listagg(CHAR_VALUE,'|') within group (order by CHAR_VALUE) TXT
    from 
        PIECE P, PIECE_CHARACTHERISTIC PC
    where     
        P.PIECE_ID = PC.PIECE_ID
    group by PIECE
)
select
    A.PIECE,
    substr(A.TXT, 1, 1) CHAR_1,
    substr(A.TXT, 3, 1) CHAR_2, 
    substr(A.TXT, 5, 1) CHAR_3
from A