左外连接不返回分组查询中的所有行

use*_*560 8 postgresql join sum

我正在尝试查询所有用户以查找上个月的订单价格。我在 PostgreSQL 上做这个。这是一个玩具数据库来显示我的问题:我有一张people桌子和一张orders桌子。我试图找到上个月所有人的订单总和。

这是我的数据:

select * from people;
 id |     name     
----+--------------
  1 | bobby lee
  2 | greg grouper
  3 | Hilldawg Ca
(3 rows)

select * from orders;
 id | person_id |    date    | price 
----+-----------+------------+-------
  1 |         3 | 2014-08-20 |  3.50
  2 |         3 | 2014-09-20 |  6.00
  3 |         3 | 2014-09-10 |  7.00
  4 |         2 | 2014-09-10 |  7.00
  5 |         2 | 2014-08-10 |  2.50
Run Code Online (Sandbox Code Playgroud)

这是我正在尝试编写的查询:

SELECT p.id, p.name, sum(o.price)
FROM people p
LEFT OUTER JOIN orders o
ON p.id = o.person_id
WHERE o.date between date '2014-09-01' AND date '2014-09-30'
GROUP BY p.id;
Run Code Online (Sandbox Code Playgroud)

这是我得到的回报:

 id |     name     |  sum  
----+--------------+-------
  2 | greg grouper |  7.00
  3 | Hilldawg Ca  | 13.00
(2 rows)
Run Code Online (Sandbox Code Playgroud)

我期待第三行,个人 id 1 (bobby lee) 上个月的订单总和为零(因为不存在 bobby 的订单)。我的查询做错了什么?我的印象是进行左外连接和分组people.id意味着people表应该设置输出中的行数。

ype*_*eᵀᴹ 11

WHERE o.date ...条件使外连接的行为类似于内连接,切掉在people中没有至少一个匹配行的任何行orders

您必须将条件 abouto.dateWHERE子句移动到 join ON

SELECT p.id, p.name, coalesce(sum(o.price), 0.00) AS total
FROM people p
  LEFT OUTER JOIN orders o
    ON  p.id = o.person_id
    AND o.date BETWEEN date '2014-09-01' AND date '2014-09-30'
GROUP BY p.id;
Run Code Online (Sandbox Code Playgroud)

测试:SQLFiddle