2016-08-16 4 views
0

私はID(プライマリキー)を持つメインテーブル「契約」を持ち、すべての行についてまとめなければならない列もあります。 私の2番目のテーブル "payments"は "contracts"と1対nの関係にあり、 "contracts"のすべての行は "payments"に0から数行あります。異なる行数とグループを持つ2つの選択を組み合わせる

私は、次のような-table "contrats" を選択することができます。

select c.Id, sum(c.field1 + c.field2 + c.field3) as TotalC from contracts c group by c.Id 

私は-tableのような "支払い" から選択することができます。

select p.Id, sum(p.field1) from payments p group by p.Id 

のでc.Idとp.Id関係がある。どちらの選択でも、契約IDごとに1行が表示されます。しかし、すべての契約が支払いを持っているわけではありません。それら2つの選択肢を合理的な方法で組み合わせることは可能ですか?または私は私のプログラムでそれらの2つの選択を取得し、SQLの外で比較を行うのが良いでしょうか?

私はscaisEdgeが提案のようにINNER JOINを使用することができますが、私はこれを持っている 問題がある

:(endresultをグループ化し、AFTER

 
ID | TotalContractSum | SinglePayment 
22 | 50,00 | 25,00 
22 | 50,00 | 30,00 

結果:選択の

結果、それがグループ化される前に、 ):

 
22 | 100,00 | 55,00 

今SinglePaymentは、それがなければならないようにまとめているが、2つの行があったのでTotalContractSumは、倍増しています支払いテーブルに表示されます。要するにここではグループ分けが問題です。単一の行に合計を使用してはならない場合は、内部使用することができます

+0

に参加:選択p.Id、合計(p.field1)の支払いpをグループからp.Idにより、選択したpと同じです。 Id、p.field1 payment p –

+0

両方のテーブルの構造を入力してください。これらの2つのテーブルの間に関係があるかどうかを知るだけです。 –

+1

この種の問題は、悪い設計の症状になる可能性があります。 – Strawberry

答えて

0

select c.Id, sum(c.field1 + c.field2 + c.field3) as TotalC , sum(p.field1) 
from contracts c 
INNER JOIN payments p 
ON c.id = p.id 
group by c.I 
+0

ご意見ありがとうございます。私はインターネット上で同様のクエリを見つけましたが、ここに問題があります。 – BionicWave

+0

は最終的に投稿を更新し、データのサンプルと予想される結果を表示します – scaisEdge

関連する問題