2012-04-07 12 views
2

IDを使用して3つのテーブルをマージしましたが、4番目のテーブルを追加しようとすると出力が完全に壊れてしまいます(値は非現実的/間違っています)この4番目のテーブルはIDをグループ化していないので、この新しいテーブルに参加する前にそれらをグループ化する必要があるという事実と関係があります。1つのテーブルを別のテーブルとマージする前に1つのテーブルをグループ化する

SELECT name, SUM(money) AS MONEY 
FROM transactions 
JOIN results ON transactions.id = results.id 
JOIN more ON results.per_id = more.per_id 
GROUP BY name 
HAVING SUM(money)>500 

を、私は新しいテーブルに参加するとき:今クエリは以下の通りです

(JOIN newtable ON results.per_id = newtable.per_id GROUP BY per_id) 

前:

SELECT name, SUM(money) AS MONEY, SUM(data_from_NT1), SUM(data_from_NT2) 
FROM transactions 
JOIN results ON transactions.id = results.id 
JOIN more ON results.per_id = more.per_id 

JOIN newtable ON results.per_id = newtable.per_id 

GROUP BY name 
HAVING SUM(money)>500 

はper_id BYコマンドグループを実行することが可能となりますこの新しいテーブルをメインテーブルに追加しますか?上記の行は機能しません。

+1

新しいテーブルと結果の間にはどのような関係がありますか?新しいテーブルに0、1つまたは複数のレコードが存在する可能性がありますか?私はあなたの結果値がトランザクションと結果で2倍になり、per_ID do notがmoreまたはnewTableに存在すれば、いくつかのレコードが削除されるかもしれないので、私は尋ねます。フル・ジョインの代わりにLEFTジョインを使用したいと思うかもしれません。予想される結果とともにいくつかのデータ出力が問題を特定するのに役立ちます。 – xQbert

答えて

1

はい、可能ですが、SELECTとして書き込む必要があります。これは可能な答えの最初のバージョンである:

SELECT name, 
     SUM(money)    AS money, 
     SUM(nt2.data_from_NT1) AS data_from_NT1, 
     SUM(nt2.data_from_NT2) AS data_from_NT2 
    FROM transactions AS t 
    JOIN results  AS r ON t.id = r.id 
    JOIN more   AS m ON r.per_id = m.per_id 
    JOIN (SELECT per_id, SUM(data_from_NT1) AS data_from_NT1, SUM(data_from_NT2) AS data_from_NT2 
      FROM newtable GROUP BY per_id 
     ) AS nt2 ON results.per_id = nt2.per_id 
GROUP BY name 
HAVING SUM(money) > 500; 

あなたがメインの選択リストで「和のSUM」を必要とするかどうかを完全には明らかではありません。おそらくあなたはしません。また、nameまたはmoneyの列がどこから来たのか明確ではありません。私は通常、適切なテーブルエイリアスを接頭辞に付けます。これらの警告では、これはあなたの後ろのものに近いかもしれません:

SELECT name, SUM(money) AS MONEY, nt2.data_from_NT1, nt2.data_from_NT2 
    FROM transactions AS t 
    JOIN results  AS r ON t.id = r.id 
    JOIN more   AS m ON r.per_id = m.per_id 
    JOIN (SELECT per_id, SUM(data_from_NT1) AS data_from_NT1, SUM(data_from_NT2) AS data_from_NT2 
      FROM newtable GROUP BY per_id 
     ) AS nt2 ON results.per_id = nt2.per_id 
GROUP BY name, nt2.data_from_NT1, nt2.data_from_NT2 
HAVING SUM(money) > 500; 

これを書く方法は間違いありません。メインクエリのグループ化は、並列サブクエリに入れるほうがよい場合があり、メインクエリに単純な直接結合が残っています。しかし、私たちはあなたのために実際にそれを行うための情報を持っていません。

+0

こんにちは!あなたは私が「総額の合計」を必要としないと言ったときに正しいと言いました。なぜ私は新しいテーブルから返された値が2倍になったのか3倍になったのかと聞いていました。よかった。ありがとう! – Alex

1

あなたがサブクエリにgroup byを移動することができ:

join (
     select per_id 
     ,  sum(col1) as col1_avg 
     ,  avg(col2) as col2_avg 
     from newtable 
     group by 
       per_id 
     ) as newtable 
on  results.per_id = newtable.per_id 

per_id上のあなたのグループ場合は、他の列を集計する必要があります。

関連する問題