2013-03-30 138 views
0

我正在尋找一種方法來聚合多個行中存在的相同外鍵。複雜的多行聚合SQL查詢

例如,ID號碼1和2應彙總在一起,因爲它們在所有行中都具有相同的確切外鍵,而ID號碼3在所有行中沒有相同的外鍵,所以它應該是分開的。

注意:使用DB2

示例源數據:

ID QUANTITY COLOR 
1 10   BLUE 
1 10   RED 
1 10   GREEN 
2 30   BLUE 
2 30   RED 
2 30   GREEN 
3 15   GREEN 
3 15   YELLOW 

所需的結果集:

TEMP_ID  SUMQTY COLOR 
1   40  BLUE 
1   40  RED 
1   40  GREEN 
2   15  GREEN 
2   15  YELLOW 
+1

請通過添加適當的標籤(Oracle,SQL Server,MySQL等)來指定您要定位的RDBMS。可能會有利用不被普遍支持的語言或產品功能的答案。此外,通過使用特定的RDBMS標記它,您的問題可能會得到更適合回答的人的關注。 – Taryn

+1

你樣本數據中的「*相同外鍵*」在哪裏? –

回答

1

首先,我們需要的,如果在 「顏色」,以找出兩個「IDS 「 是相同的。以下查詢完成color上的完整外部聯接,然後通過id進行彙總。如果兩個id■找顏色相同,則全外連接總是匹配 - 有沒有空值:

select s1.id, s2.id 
from s s1 full outer join 
    s s2 
    on s1.color = s2.color 
group by s1.id, s2.id 
having sum(case when s1.color is null then 1 else 0 end) = 0 and 
     sum(case when s2.color is null then 1 else 0 end) = 0 

使用同樣的思路,我們可以將最小s1.id作爲的「身份證」組。這組ID,然後爲我們提供了所需的最終聚合的信息:

select s3.groupid, sum(s3.quantity) as quantity, s3.color as color 
from (select min(s1.id) as groupid, s2.id 
     from (select s1.id, s2.id 
      from s s1 full outer join 
       s s2 
       on s1.color = s2.color 
      group by s1.id, s2.id 
      having sum(case when s1.color is null then 1 else 0 end) = 0 and 
        sum(case when s2.color is null then 1 else 0 end) = 0 
      ) ss 
     group by s2.id 
    ) sg join 
    s s3 
    on sg.id = s.id 
group by sg.groupid, s3.color 

在DB2中,您還可以使用listagg做到這一點。首先,你需要得到的顏色列表中找出共性,然後使用它:

select min(s.id) as groupid, sum(s.quantity) as quantity, s.color 
from (select id, listagg(color order by color) as thegroup 
     from s 
     group by id 
    ) sg join 
    s 
    on sg.id = s.id 
group by sg.thegroup, s.color 

這可能是比第一個解決方案更有效。

+0

謝謝!充分利用完整的外連接,並且還可以很好地調用LISTAGG功能! – user1527312