2016-11-18 24 views
0

我正在嘗試透視數據集。我需要能夠過濾進入數據透視表的值,但是數據透視表本身將會是更大SELECT語句的一部分。Oracle中的預過濾器數據透視數據

所以,舉例來說:

WITH TEST_DATA AS (
    SELECT 1 AS ID, 'ALUM' AS DONOR_CODE, 1 AS PRIORITY FROM DUAL 
    UNION 
    SELECT 1 AS ID, 'STAFF' AS DONOR_CODE, 2 AS PRIORITY FROM DUAL 
    UNION 
    SELECT 8 AS ID, 'ALUM' AS DONOR_CODE, 1 AS PRIORITY FROM DUAL 
    UNION 
    SELECT 8 AS ID, 'ALMG' AS DONOR_CODE, 2 AS PRORITY FROM DUAL 
    UNION 
    SELECT 8 AS ID, 'STAF' AS DONOR_CODE, 3 AS PRORITY FROM DUAL 
) 
, PIVOT_DATA AS (
    SELECT * 
    FROM TEST_DATA 
    PIVOT (MAX(DONOR_CODE) AS DONOR_CODE FOR PRIORITY IN (1,2,3) 
) 
) 
SELECT * FROM PIVOT_DATA; 

回報......

ID 1_DONOR_CODE 2_DONOR_CODE 3_DONOR_CODE 
    1 ALUM   STAFF 
    8 ALUM   ALMG   STAF 

我需要什麼,能夠做的是過濾TEST_DATA它被轉動之前。所以,如果我只想看看有'ALMG'的ID,我怎麼能得到一個看起來像的結果集...

ID 1_DONOR_CODE 2_DONOR_CODE 3_DONOR_CODE 
    8 ALMG 

謝謝。

+1

爲什麼''almg''去'1_donor',而不是'2_donor'? –

回答

1

你可以子查詢TEST_DATA表:

PIVOT_DATA AS (
    SELECT * 
    FROM 
    (
     SELECT * 
     FROM TEST_DATA 
     WHERE DONOR_CODE = 'ALMG' 
    ) 
    PIVOT (MAX(DONOR_CODE) AS DONOR_CODE FOR PRIORITY IN (1,2,3) 
    ) 
) 
SELECT * FROM PIVOT_DATA; 
+0

[** DEMO **](http://rextester.com/OBYLI19981)我會用另一個cte,但是同樣的想法。 –

+0

我如何從實際的SELECT中傳遞ALMG?我不會在設計時知道用戶會選擇什麼樣的價值。最終,主要CTE將成爲視圖的一部分。 – tayknight

+0

如果您需要動態行爲,那麼視圖可能不是要走的路。你應該可以通過你的應用層中的動態SQL來做到這一點。 –

相關問題