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.date从WHERE子句移动到 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
| 归档时间: |
|
| 查看次数: |
8313 次 |
| 最近记录: |