2017-02-18 3 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  | 

列のattによって追加され、別の列として結果表に追加されval1とval2のとval3は

ここは私の解決策です

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の* ANSI 'JOIN'構文 - ** 92 ** SQL標準(** 25年前**)とその使用はお勧めしません –

答えて

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。 。 。これらのクエリは、特に集約の観点から、正しく形成されています。このエラーは通常、 'group'にない' select'に集約されていないカラムがあるときに発生します。 –

+0

@VonAso - クエリは正しいです、私はそれをテストしました(ただし、2番目の 'att'値は' PM'ではなく 'M'です)。 'coalesce'は正しい解のようには見えません(すべての値が' null'でも0を生成します。その場合、**合理的な定義では結果は 'null'になります)。結合はカーディナリティーを減らすために、以前ではなく集約の後にのみ実行する必要がありますが、これは正しさではなく効率に関するものです。書かれたクエリは正しいものであり、正常に動作します。 – mathguy

関連する問題