2017-02-18 241 views
-1

我有一個關於從另一個表中添加多個列值的問題,並作爲添加列返回給結果。SQL查詢添加多列

這是我的第一張桌子。

attID | val1 | val2 | val3 | att | 
-----------+---------+---------+----------+---------+ 
    1  | 10 | 10 | 10  | P | 
    1  | 20 | 20 | 20  | M | 
    1  | 30 | 30 | 30  | HA | 
    2  | 1  | 1  | 1  | P | 
    2  | 2  | 2  | 2  | M | 
    2  | 3  | 3  | 3  | HA | 

我的第二個表是

ID | name | attID | 
---------+--------+---------+ 
    101 | luke | 1  | 
    102 | zik | 2  | 

我想要的結果是:

ID | name |  P  | M  |  HA  | 
-----+--------+--------------+----------+------------+ 
101 | luke |  30  | 60  |  90  | 
102 | zik |  3  | 6  |  9  | 

列VAL1 VAL2和VAL3由ATT添加,並添加到結果表的另一列我的解決方案

select 
    ID, Name, 
    (val1 + val2 + val3) P, 
    (val1 + val2 + val3) M, 
    (val1 + val2 + val3) HA 
from 
    t1, t2 
where 
    t1.attid = t2.addid 
group by 
    att 

我試過很多次,但事先無法找出解決的辦法

感謝,如果有人可以給我真正的解決方案

+0

請發表你已經試過什麼一個例子,什麼結果是 – metame

+1

[不良習慣踢:使用舊樣式的JOIN(http://sqlblog.com /blogs/aaron_bertrand/archive/2009/10/08/bad-habits-to-kick-using-old-style-joins.aspx) - 舊式*逗號分隔的表*樣式列表已替換爲*在ANSI - ** 92 ** SQL標準(** 25年**前)中使用ANSI + JOIN'語法,並且不鼓勵使用 –

回答

1

您可以join,聚集做到這一點,一些算術:

select t2.ID, t2.name , 
     sum(case when att = 'P' then val1 + val2 + val3 end) as P, 
     sum(case when att = 'M' then val1 + val2 + val3 end) as M, 
     sum(case when att = 'HA' then val1 + val2 + val3 end) as HA 
from t2 left join 
    t1 
    on t2.attId = t1.attId 
group by t2.ID, t2.name ; 

在你的例子中,沒有任何值是NULL。如果是這種情況,你要小心並使用coalesce()。我想我會推薦一個子查詢:

select t2.ID, t2.name , 
     sum(case when att = 'P' then val end) as P, 
     sum(case when att = 'M' then val end) as M, 
     sum(case when att = 'HA' then val end) as HA 
from t2 left join 
    (select t1.*, 
      (coalesce(val1, 0) + coalesce(val2, 0) + coalesce(va3, 0) 
      ) as val 
     from t1 
    ) t1 
    on t2.attId = t1.attId 
group by t2.ID, t2.name ; 
+0

謝謝你的回答,這將是最好的。但如果我將此應用於我的真實表格,則出現錯誤。錯誤是說「不是單組功能」, –

+0

@VonAso。 。 。這些查詢看起來是正確的,特別是從聚合的角度來看。這個錯誤通常發生在'select'中不包含'group by'的列中。 –

+0

@VonAso - 查詢是正確的,我只是測試它(除了第二個'att'值是'M'而不是'PM')。 'coalesce'似乎並不是正確的解決方案(即使所有值都爲null,在這種情況下,通過** any **合理的定義,結果應該爲null),它將產生0。並且只有在聚合之後才能完成加入,而不是在之前減少基數,但這只是關於效率而不是正確性。所寫的查詢是正確的,運行良好。 – mathguy