SQL总和包括0

时间:2015-07-17 06:44:28

标签: mysql join

我有两张桌子。一个是包含员工信息的员工表,另一个表是员工的销售额。我试图将员工在一个月内的销售总额分组,包括他/她实现零销售的月份。以下是表格中的一些值

员工表

number             name
1                  Matt
2                  Foggy
3                  Karen
4                  Wilson

销售

employee_number           month          sale_number          sale_amount
1                         January 2015       1                    300
1                         January 2015       2                     50
1                         February 2015      1                     400
2                         March 2015         1                     300
3                         January 2015       1                     50

我能够使用以下查询编写查询以获取月度销售额

select sum(sales.sale_amount), sales.employee_number, sales.month, sales.sale_number from sales group by employee_number, month;

现在因为我还需要包括零的月份,我认为在不同月份的外部联接应该可以做到这一点。但是输出仍然包含之前的相同输出,没有零或null。左外连接是否不加入空值?

输出应该是这样的。 number name sale_amount sale_month 1 Matt 350 January 2015 1 Matt 400 February 2015 1 Matt 0 March 2015 2 Foggy 0 January 2015 2 Foggy 0 February 2015 2 Foggy 300 March 2015 等等。

2 个答案:

答案 0 :(得分:1)

left outer join会为右手表中的缺失行提出null值。要显示所有月份,您需要切换表格的顺序:

from    months
cross join
        employees
left outer join 
        sales 
on      sales.month = months.month
        and employees.number = sales.employee_number

如果你错过了月份表,你可以从销售表中找到一个:

select  months.month
,       employees.name
,       sum(sale_amount) as sales
from    (
        select  distinct month
        from    sales
        ) as months
cross join
        employees
left outer join 
        sales 
on      sales.month = months.month
        and employees.number = sales.employee_number
group by
        months.month
,       employees.name

Example at SQL Fiddle.

答案 1 :(得分:0)

以下查询可以帮助您:

SELECT q1.month, q1.number, q2.total_sales FROM
    (SELECT distinct s.month, e.number 
        FROM sales s, Employees e) AS q1
    LEFT JOIN
    (SELECT SUM(sales.sale_amount) AS total_sales, sales.employee_number, sales.month, sales.sale_number 
        FROM sales group by employee_number, month) AS q2
    ON (q1.month = q2.month) AND (q1.number = q2.employee_number) 
ORDER BY month, number;

检查fiddle