SQL 服务器:COUNT 与 WHERE 一起使用

SQL Server: COUNT used with WHERE

所以我认为自己是 SQL 服务器的新手,所以较少使用的关键字如 HAVINGCOUNT() 等。所以当我收到此错误时:

An aggregate may not appear in the WHERE clause unless it is in a subquery contained in a HAVING clause or a select list, and the column being aggregated is an outer reference.

最后一点我真的很困惑。 "a select list?" "column being aggregated is an outer reference?" 谁能通俗地解释一下?

基本上它说的是你不能这样做:

WHERE COUNT(ColumnA) = 100 

您需要 HAVINGGROUP BY 之后:

SELECT COUNT(ColumnA) AS CountA, ColumnB, ColumnC
FROM Table
GROUP BY ColumnB, ColumnC
HAVING COUNT(ColumnA) = 100

SELECT-列表是

SELECT a, b, c ...    <=== this list of expressions after SELECT

外部引用是子查询中引用的周围查询的列。这里有清楚的解释:Aggregates with an Outer Reference

请注意,WHERE 子句在 分组(使用 GROUP BY)和 HAVING 子句在 分组后应用。因此,聚合函数可以出现在 HAVING 子句中,但不能出现在 WHERE 子句中。

SELECT customer_id, COUNT(*) as number_of_orders, SUM(amount) AS total_amount
FROM cust_orders
WHERE year(order_date) = 2017      -- filters records before grouping.
GROUP BY customer_id               -- groups while counting and summing up.
HAVING COUNT(*) > 2                -- count is available here.

这将选择 2017 年的所有客户订单并计算每个客户的总数。只返回今年订单超过2个的客户。

基本上是说,如果您想在这些地方使用聚合,则需要使用引用另一个 table 的子查询:

SELECT A,
       B,
       C
FROM Table T
WHERE A = (SELECT MAX(D) FROM Table T2 WHERE T2.A = T.A) 
          --Valid, MAX(D) is an outer reference to another table we call T2

SELECT A,
       B,
       C
FROM Table T
WHERE A = MAX(D) --Invalid

HAVING 版本应该是这样的:

SELECT A,
       B,
       C
FROM Table T
GROUP BY A,
         B,
         C
HAVING COUNT(*) > (SELECT MAX(D) FROM Table T2) --Valid

SELECT A,
       B,
       C
FROM Table T
GROUP BY A,
         B,
         C
HAVING COUNT(*) > MAX(D) --Invalid