我对几个测试表有以下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"作为数量。
答案 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;
请注意,我在查询中添加了表别名。这使查询更容易编写和阅读。