2017-07-18 110 views
1

我想通過多列和ID對錶格進行求和。SQL總結多列多個列

我的表(也就是2個表的連接)看起來是這樣的:

unique_ID, year, ID1, Amount1, ID2, Amount2, ID3, Amount3, ... , ID6, Amount6; 

我需要得到大量(Amount1+Amount2+...+Amount6)的總和,其中的ID匹配(ID1=ID2=...=ID6)

那麼結果表是這樣的: Year, ID1(/ID2/.../ID6), Amount1 + ... + Amount6

示例數據:(用Excel製作)

 
Source table          
UID  YEAR ROOM1  AMOUNT1 ROOM2  AMOUNT2 
15823 2015 Material1 1  Material3 8 
15298 2015 Material1 2  Material3 9 
22405 2015 Material2 3  Material4 10 
22403 2015 Material2 4  Material5 11 
22404 2015 Material2 5  Material5 12 
25417 2016 Material1 6     0 
31435 2016 Material2 7  Material2 13 

Result table   
YEAR Material AMOUNT 
2015 Material1 3 
2015 Material2 12 
2015 Material3 17 
2015 Material4 10 
2015 Material5 23 
2016 Material1 6 
2016 Material2 20 

說明: 我有一個產品,那裏有一個很大的表每個產品最多可以包含6種原料。 (ID 1-6標識材料,數量1-6顯示使用材料的數量)。材料的順序可能會有所不同。 我需要知道按年份和材料使用的材料數量。

我有一半的解決方案需要在excel中進行大量的事後處理。 是否有任何簡單而優雅的解決方案在SQL中執行?

我正在使用火鳥,但任何幫助,將不勝感激。

在此先感謝!

+0

這看起來像壞桌子的設計。爲什麼不同欄目中的金額? –

+0

請張貼一些樣本數據並輸出您期望的相同。 –

+0

它是這樣設計的。每個記錄(行)是一個產品,最多6個房間的原材料。 –

回答

2

看來你想每年和材料的總量。因此,首先快速獲得適當的材料/年表,然後彙總:

select 
    year, 
    material_id, 
    sum(amount) as total 
from 
(
    select year, id1 as material_id, amount1 as amount from mytable 
    union all 
    select year, id2 as material_id, amount2 as amount from mytable 
    union all 
    select year, id3 as material_id, amount3 as amount from mytable 
    union all 
    select year, id4 as material_id, amount4 as amount from mytable 
    union all 
    select year, id5 as material_id, amount5 as amount from mytable 
    union all 
    select year, id6 as material_id, amount6 as amount from mytable 
) materials 
where material_id is not null 
group by year, material_id 
order by year, material_id; 
+0

這就是它,它的工作就像魔術! :-) –

+0

還有一個問題。 「mytable」是另外兩個表的連接。現在我必須每一步都做到這一點。在主選擇之前,我怎樣才能使它成爲一次,然後只是指它呢? –

+0

@JánosiZoltánJános編輯你的問題,並在問題中顯示這兩個表。而且,這種設計看起來很有問題。不同的材料應該是不同的行不是不同的列。 –