2013-03-14 57 views
0

想我也喜歡這樣的表:總結類似行

NAME REF1 REF2 DRCT 
    A (null) Ra  D1 
    A  Rb (null) D1 
    A (null) Rc  D2 
    B  Rd (null) D3 
    B (null) Re  D3 

我想在像這樣聚集表:

NAME REF1 REF2 DRCT 
A  Rb  Ra  D1 
A (null) Rc  D2 
B  Rd  Re  D3 

正如你所看到的,我想用聚合相同的每一行名稱。我搜索了COALESCE和各種聚合函數,但是我還沒有找到我想要的東西。任何想法?

+0

可以REF1和REF2採取一個給定的名稱和DRCT什麼樣的價值觀?以你爲例,對於NAME = A和DRCT = D1的記錄,REF1只能取(空)或Rb,或者REF1可能是Rx? – neutrino 2013-03-14 14:13:59

+0

每個值都是允許的。但是每行只能定義一個列。如果ref1被定義,ref2將爲空。反之亦然。 – 2013-03-14 15:40:15

+0

然後,我想我的答案會爲你工作。但我會以更簡單的方式去思考。 – neutrino 2013-03-14 16:18:12

回答

1

假設我問我在以前的評論是真實的,(只空或REF1和REF2每個名稱,DRCT對一個給定的值),這似乎工作:

select NAME, M_REF1, M_REF2, DRCT 
from (
    select A.NAME, coalesce(A.REF1, B.REF1) m_REF1, 
     coalesce(A.REF2, B.REF2) m_REF2, A.REF1 A_REF1, B.REF1 B_REF1, 
     A.REF2 A_REF2, B.REF2 B_REF2, A.DRCT 
    from Table1 A JOIN Table1 B on A.NAME = B.NAME AND A.DRCT = B.DRCT) 
    WHERE A_REF1 = m_REF1 AND B_REF2 = m_REF2 
UNION 
select A.NAME, A.REF1, A.REF2, A.DRCT 
FROM Table1 A JOIN 
    (select NAME, DRCT, COUNT(*) 
     from Table1 
     group by NAME, DRCT 
     HAVING COUNT(*) = 1) B ON A.NAME = B.NAME AND A.DRCT = B.DRCT; 

工會是因爲只有一個記錄的行不包含在第一個SELECT中。

但這是有點簡單,工程太:

select A.NAME, coalesce(A.REF1, B.REF1) M_REF1, coalesce(A.REF2,B.REF2) M_REF2,A.DRCT 
from Table1 A LEFT OUTER JOIN Table1 B ON A.DRCT = B.DRCT AND A.NAME = B.NAME 
WHERE NVL2(A.REF1,0,1) = 1 AND NVL2(B.REF1,0,1) =0 
     AND NVL2(A.REF2,0,1) = 0 AND NVL2(B.REF2,0,1) = 1 
UNION 
select A.NAME, A.REF1, A.REF2, A.DRCT 
FROM Table1 A JOIN 
(select NAME, DRCT, COUNT(*) 
    from Table1 
    group by NAME, DRCT 
    HAVING COUNT(*) = 1) B ON A.NAME = B.NAME AND A.DRCT = B.DRCT; 
+0

我正在嘗試。我看到一個奇怪的where子句,第二個和第三個AND是平等的。你什麼意思? – 2013-03-15 10:14:20

+0

更正!並更新迴應。 – neutrino 2013-03-15 10:49:14

+0

如果我需要翻譯四列的兩列論證會怎麼樣?我只需要在where子句中添加兩個AND,或者我需要甚至兩個進一步的左連接? – 2013-03-15 11:13:18