2017-04-10 64 views
0

假設我有一張表,其中包含按行和6列的發票行,其中員工ID可以標記爲該發票。員工ID不能連續複製,但不同列的不同發票行可以存在相同的員工ID。在下面的表中,REP 1應具有我希望能夠總結由僱員ID的總量的500根據多列中存在的ID總結髮票金額

enter image description here

總量(REP 1,REP 2,等等。)。我可以通過一個大型的聯合查詢來做到這一點,但問題是我有一個我需要總結的大約450個員工ID的列表。有沒有辦法讓我有一個查詢吐出一張員工ID和他們的總金額列表?

+0

根據有關證據(2個標籤對1),我刪除了MySQL的標籤。如果你的問題不是關於SQL Server的,請適當標記。 –

+0

首先讓我們來澄清你使用的產品:MySQL或MS SQL服務器。另外,是否可以對數據結構進行非規範化處理,並在記錄中插入時隙,而不是列中。 – Shadow

+0

我的歉意,我更新了標籤。版本是Microsoft SQL Server。 – raidboss

回答

2

我會建議使用cross apply

select v.e, sum(t.amount) 
from t cross apply 
    (values (slot1), (slot2), (slot3), (slot4), (slot5), (slot6)) v(e) 
group by v.e; 

注:這是假設您正在使用SQL Server。

+0

這是否說明了每個插槽中所有可能的不同值? – raidboss

+0

謝謝,這個作品完美。 – raidboss

1

連接表是一種方式......

select e.employee_id, 
     sum(i.amount) 
    from invoice i, 
    join employee e on (e.employee_id in (i.slot1, i.slot2, i.slot3, i.slot4, i.slot5, i.slot6)) 
group by e.employee_id; 

的另一種方式......

select employee_id, 
     sum(amount) 
from (
    select slot1 employee_id, sum(amount) amount from invoice group by slot1 union 
    select slot2, sum(amount) from invoice group by slot2 union all 
    select slot3, sum(amount) from invoice group by slot3 union all 
    select slot4, sum(amount) from invoice group by slot4 union all 
    select slot5, sum(amount) from invoice group by slot5 union all 
    select slot6, sum(amount) from invoice group by slot6 
) as q1 
group by employee_id; 
+0

@ RMathis,即使您是通過第一個插槽中的employee_id進行分組,您是否可以爲所有6列中的所有ID選擇另一個查詢帳戶? – raidboss

+0

是的......在第一個quyery中,加入員工表允許每個員工獲得信貸。第二個查詢將派生表中每個插槽的聚合結果聯合起來,然後將其最後一次聚合在一起。第一個查詢確定列名稱,以便所有槽在employee_id列中提供標識符,並且所有金額(金額)都被賦予名稱金額。聯盟是更好的選擇 - 我相應地更新了答案。 – RMathis