SQL-在WHERE子句中使用Count

  • 本文关键字:Count 子句 WHERE SQL- sql
  • 更新时间 :
  • 英文 :


我试图做一个简单的、乍一看的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子句就没有必要了
  • 表别名使查询更易于读取和写入
  • 列别名不要使用单引号。最好为列命名,这样它们就不需要转义

最新更新