2012-01-10 120 views
1

我有命名为出纳,SALES三个不同的表,和REFUNDS计算两个不同的列的总和的两个表

CASHIER表具有:

cashierID/cashier_name

SALES表具有:

salesID/cashierID/amountReceived

REFUNDS表具有:

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 2012-01-10 03:11:57

+0

如果出纳员没有出售或没有返回任何东西,您将从LEFT JOIN获得0而不是NULL。 – piotrm 2012-01-10 03:14:10

+0

好的。再次感谢! – mathan0690 2012-01-10 03:16:43

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。以略胜一筹的速度击败我。 (有趣的是,它甚至包括了与表格相同的别名选择。):) – 2012-01-10 02:25:08

+0

先生,你会介意我问这个问题吗?在你的小组中,1和2,你是什么意思?你是否将它与第一列和第二列分组? – 2012-01-10 02:30:48

+1

@johntotetwoo GROUP BY 1,2''是SQL标准缩写,意思是“GROUP BY ,”,即在这种情况下具有与“GROUP BY c.cashierID,c.cashier_name”完全相同的含义。许多人不喜欢这样,但我发现它远远更容易阅读和维护。顺便说一句,你可以列出尽可能多的列号,只要你喜欢什么顺序 – Bohemian 2012-01-10 02:48:20