2012-01-10 15 views
1

から二つの異なる列の和の差を計算する私は、3つの異なるキャッシャーとして名前のテーブル、販売、払い戻しを持って二つのテーブル

レジテーブルはあります

cashierID/cashier_name

SALES表があります。

salesID/cashierID/amountReceived

返金テーブルがあります。

refundsID/cashierID/amountRefunded

私はレジ係の総量がそれぞれamountReceivedとamountRefunded列を経由して販売して払い戻しから受信し、表示します。そのためのmysql構文がありますか?どうもありがとう!

答えて

1
SELECT c.cashier_name AS cashier, 
    COALESCE(salesByCashier.totalSales, 0) AS sales, 
    COALESCE(refundsByCashier.totalRefunded, 0) AS refunds, 
    COALESCE(salesByCashier.totalSales, 0) - 
     COALESCE(refundsByCashier.totalRefunded, 0 ) AS total 
FROM 
    cashier c 
LEFT JOIN 
    (SELECT s.cashierID AS cashierID, SUM(amountReceived) AS totalSales 
    FROM sales s 
    GROUP BY s.cashierID) salesByCashier 
ON c.cashierID = salesByCashier.cashierID 
LEFT JOIN 
    (SELECT r.cashierID AS cashierID, SUM(amountRefunded) AS totalRefunded 
    FROM refunds r 
    GROUP BY r.cashierID) refundsByCashier 
ON c.cashierID = refundsByCashier.cashierID 
+0

これはそれだと思います!どうもありがとう。 私は質問をすることができます、COALESCE(フィールド1、0)の意味は何ですか? – mathan0690

+0

キャッシャーが何も売っていない、または何も返さなかった場合、LEFT JOINからNULLの代わりに0が得られます。 – piotrm

+0

ok。再度、感謝します! – mathan0690

1
select 
    c.cashierID, 
    c.cashier_name, 
    sum(s.amountReceived) as totalReceived, 
    sum(r.amountRefunded) as totalRefunded 
from CASHIER c 
left join SALES s on s.cashierID = c.cashierID 
left join REFUNDS r on r.cashierID = c.cashierID 
group by 1,2 
+1

+1。マウスを少し上げるだけで私を打つ。 (おかしい;それはテーブルの別名の同じ選択肢を含んでいた。):) –

+0

私はこの質問をしてもらえますか? 1と2のgroup by節では、それはどういう意味ですか?最初の列と2番目の列でグループ分けしますか? –

+1

@johntotetwoo 'GROUP BY 1,2 'は、' GROUP BY c.cashierID、c.cashier_name'と全く同じ意味を持つ、つまりGROUP BY を意味するSQL標準省略形です。多くの人々はこれが気に入らないのですが、私は遠くにそれを読んで維持する方が簡単です。 btw、好きな順番に好きなだけ多くの列番号を列挙できます – Bohemian