我试图做一个简单的、乍一看的SQL查询,但我无法理解我做错了什么。
问题
想象一下,这些是我的桌子:
TableUsers
UserID FirstName LastName
1 Bill Johnson
2 Alex Agnew
3 Mike Owen
4 Kate Ryan
表格文章
ArticleID Description
1 Bananas
2 Eggs
3 Milk
表格订单
OrderID UserID ArticleID
1 1 1
2 1 2
3 2 3
4 2 2
5 3 3
我想列出所有至少有一个订单链接到他们名字的用户,计算有多少订单,以及他们订购了多少特定物品:
所需结果
UserID FirstName # Orders # Banana orders # Egg orders
1 Bill 2 1 1
2 Alex 2 0 1
3 Mike 1 0 0
我尝试过:
SELECT
UserID,
FirstName,
COUNT(*) AS '# Orders',
(SELECT COUNT(*) FROM TableOrders O WHERE O.UserID = TableOrders.UserID AND O.ArticleID = 1) AS '# Banana orders',
(SELECT COUNT(*) FROM TableOrders O WHERE O.UserID = TableOrders.UserID AND O.ArticleID = 2) AS '# Egg orders',
FROM TableUsers
LEFT JOIN TableOrders ON TableOrders.UserID = TableUsers.UserID
GROUP BY UserID, FirstName
HAVING Count(*) > 0;
但我得到了一个错误,说ArticleID需要在聚合函数或逐子句中。如果我将ArticleID添加到groupby子句中,则具有多个订单的用户将显示不止一次。。。
感谢您的帮助!
谢谢!
只需使用条件聚合:
SELECT o.UserID, o.FirstName, COUNT(*) AS num_orders,
SUM(CASE WHEN o.ArticleID = 1 THEN 1 ELSE 0 END) as num_bananas,
SUM(CASE WHEN o.ArticleID = 2 THEN 1 ELSE 0 END) as num_eggs
FROM TableUsers u JOIN
TableOrders o
ON o.UserID = u.UserID
GROUP BY UserID, FirstName;
注:
- 您想要有订单的用户,所以只使用内部联接,而不是外部联接
- 那么
HAVING
子句就没有必要了 - 表别名使查询更易于读取和写入
- 列别名不要使用单引号。最好为列命名,这样它们就不需要转义