2016-05-03 11 views
3

テーブル私のSQLクエリが参加

Id  Name   Amount 
1  MR XXX   10000 
2  Mr YYY   15000 
3  Mr ZZZ   12000 

収集表私は何を探していますがこれです

ID Name  Amount 
1  Mr XXX  5000 
2  Mr XXX  2000 
3  Mr YYY  12000 
4  Mr YYY  1000 

ToBeCollected。

ID Name ToBeCollected Collected  Balance 
1 Mr XXX  10,000   7,000  3,000 
2 Mr YYY  15,000   13,000  2,000 
3 Mr ZZZ  12,000    0  12,000 

ありがとうございます。

は、だからあなたのクエリは次のようになります

答えて

0

あなたがjoin, max(), GROUP BYシンプルかつIFNULL()機能を使用して、この出力を達成することができ、

SELECT ToBeCollected.Id,ToBeCollected.Name, 
     max(ToBeCollected.Amount) as ToBeCollected, 
     IFNULL(sum(Collected.Amount),0) as Collected, 
     max(ToBeCollected.Amount) - IFNULL(sum(Collected.Amount),0) as Balance 
    FROM ToBeCollected 
    LEFT JOIN Collected ON Collected.Name = ToBeCollected.Name 
    GROUP BY ToBeCollected.Id 

:あなたはSQLFiddle上で確認することができ、出力を必要とし、あなたがこのDocumentを参照することができます。

+1

外部結合が必要です。isnullは何もしません。 – sagi

+0

ありがとうございました。@ sagi、私は答えを更新しました。 –

1

は、このクエリを試してみてください....あなたの例に基づいて

SELECT t.id,t.name,max(t.amt) as tobeCol, 
     coalesce(s.amt,0) as Col, 
     max(t.amt) - coalesce(s.amt,0) as Balance 
FROM ToBeCollected t 
LEFT JOIN (select sum(amt) as amt,name from Collected group by name) s on s.name=t.name 
group by t.name,t.id; 
+0

なぜ合計は2回ですか?そのgenarally私のものと同じクエリですか? – sagi

+0

@サギ私のクエリの出力を確認する必要があります –

+0

@SmitaAhinaveエイリアス 't'を入力することを忘れないでください –

0

を、二つのテーブルは、[名前]列によってリンクされています。副選択は名前ごとに複数の行がtable_Collectedであるとして収集量を算出するために使用される

SELECT tb.Id, tb.Name, tb.Amount ToBeCollected, 
ifnull(SUM(cl.Amount), 0) Collected, 
(tb.Amount - ifnull(SUM(cl.Amount), 0)) Balance 
FROM ToBeCollected tb LEFT JOIN Collected cl ON (tb.Name = cl.Name) 
GROUP BY tb.Name 
0
select 
t.ID, 
t.name, 
t.Amount as ToBeCollected, 
if(c.total_amount_collected is null, 0, c.total_amount_collected) as Collected, 
if(c.total_amount_collected is null, t.amount, t.amount - c.total_amount_collected) as Balance 
from ToBeCollected t 
left join (select Name, sum(Amount) as total_amount_collected from Collected group by Name) as c 
on(t.Name = c.Name) 

: あなたはこれを試すことができます。 ifでcの対応する行を持たないtの行を補うために使用する

関連する問題