2014-06-10 37 views
0

我工作的報告有以下類型的表(值是編造的演示的緣故):的Oracle SQL Developer - 轉表留下多行對同一ID

___________________________________________ 
|__ID__|_Feline_|_Canine_|_Avian__|_Rodent_| 
|_1001_|_Snow___|_[null]_|_[null]_|_[null]_| 
|_1001_|_[null]_|_Spike__|_[null]_|_[null]_| 
|_1001_|_[null]_|_[null]_|_Polly__|_[null]_| 
|_1001_|_[null]_|_[null]_|_[null]_|_Jumper_| 
|_1001_|_Max____|_[null]_|_[null]_|_[null]_| 

什麼我想這樣做,是將值壓縮到單行(使用MAX(CASE)和GROUP BY ID工作)中,但如果出現更多次出現的相同ID,則還會有另一行,在這種情況下,「貓「值(如果使用GROUP BY ID,則不會發生):

___________________________________________ 
|__ID__|_Feline_|_Canine_|_Avian__|_Rodent_| 
|_1001_|_Snow___|_Spike__|_Polly__|_Jumper_| 
|_1001_|_Max____|_Spike__|_Polly__|_Jumper_| 

我最好的選擇是可能有MAX(CASE)對於Feline1和MIN(CASE)對於Feline2來說,它們將它們放到同一行(不同列)而不是兩行(同一列),但我想知道是否有辦法獲得上述結果。

非常感謝!只要名稱不重複列內 -

+1

聽起來像你想要某種'CROSS JOIN'。可能在某種「SELECT DISTINCT」中被subqueried。 –

回答

0

雖然有最高每列兩個非NULL值,你可以用

SELECT 
    ID 
    , MIN(Feline) Feline 
    , MIN(Canine) Canine 
    , MIN(Avian) Avian 
    , MIN(Rodent) Rodent 
FROM Input 
GROUP BY ID 
UNION ALL 
SELECT 
    ID 
    , MAX(Feline) 
    , MAX(Canine) 
    , MAX(Avian) 
    , MAX(Rodent) 
FROM Input 
GROUP BY ID 
ORDER BY ID 
; 

SQL Fiddle

否則下面應該幫助的一方去:

SELECT DISTINCT 
    T1.ID 
    , T2.Feline 
    , T3.Canine 
    , T4.Avian 
    , T5.Rodent 
FROM Input T1, Input T2, Input T3, Input T4, Input T5 
WHERE T2.Feline IS NOT NULL 
    AND T3.Canine IS NOT NULL 
    AND T4.Avian IS NOT NULL 
    AND T5.Rodent IS NOT NULL 
ORDER BY ID, Feline, Canine, Avian, Rodent 
; 

SELECT 
    T1.ID 
    , T2.Feline 
    , T3.Canine 
    , T4.Avian 
    , T5.Rodent 
FROM (
    SELECT DISTINCT 
    T1.ID 
    FROM Input T1 
) T1, Input T2, Input T3, Input T4, Input T5 
WHERE 
    T2.Feline IS NOT NULL 
    AND T3.Canine IS NOT NULL 
    AND T4.Avian IS NOT NULL 
    AND T5.Rodent IS NOT NULL 
ORDER BY ID, Feline, Canine, Avian, Rodent 
; 

SQL Fiddle

如果在一列中有重複 - 呃,輸出應該是什麼樣子?最後一個會有他們,之前的不會。

如果我錯過了一點,只是評論,我會盡力跟進。