左连接列上的SUM限制了结果

时间:2016-08-31 10:39:12

标签: mysql sql

我对几个测试表有以下SQL查询:

SELECT salesperson.spnum, salesperson.spname, sales.quantity
FROM salesperson
LEFT JOIN sales ON sales.spnum = salesperson.spnum;

返回以下结果:

spnum   spname  quantity
1   "Bob Jansen"    5
1   "Bob Jansen"    10
1   "Bob Jansen"    1600
2   "Henk de Vries" NULL
3   "Anne de Graaf" NULL

但是,当我使用SUM()进行选择时:

SELECT salesperson.spnum, salesperson.spname, SUM(sales.quantity) AS quantity
FROM salesperson
LEFT JOIN sales ON sales.spnum = salesperson.spnum;

我只从quantity列不为空的行中获得结果:

spnum   spname  quantity
1   "Bob Jansen"    1615

如何阻止SUM()限制我的结果?我想得到NULL或" 0"作为数量。

2 个答案:

答案 0 :(得分:2)

添加一个组(无论如何都必须运行)

SELECT salesperson.spnum, salesperson.spname, SUM(sales.quantity) AS quantity FROM salesperson
LEFT JOIN sales ON sales.spnum = salesperson.spnum
GROUP BY salesperson.spnum, salesperson.spname;

即使为null

,也应该显示它们

答案 1 :(得分:1)

你误解了正在发生的事情。

在原始查询中添加SUM()时,您将查询转换为聚合查询。没有GROUP BY 总是的聚合查询只返回一行(即使原始表没有行)。 SUM()所有列的SUM()

在大多数数据库中,您的代码会返回错误,因为SELECT中的列不在GROUP BY中。 MySQL确实支持这种语法 - 虽然我的建议基本上是永远不要使用它。

解决方案很简单:添加适当的GROUP BY子句:

SELECT sp.spnum, sp.spname, SUM(s.quantity) AS quantity
FROM salesperson sp LEFT JOIN
     sales s
     ON s.spnum = sp.spnum
GROUP BY sp.spnum, sp.spname;

请注意,我在查询中添加了表别名。这使查询更容易编写和阅读。