SQL 服务器:COUNT 与 WHERE 一起使用
SQL Server: COUNT used with WHERE
所以我认为自己是 SQL 服务器的新手,所以较少使用的关键字如 HAVING
和 COUNT()
等。所以当我收到此错误时:
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
您需要 HAVING
在 GROUP 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
所以我认为自己是 SQL 服务器的新手,所以较少使用的关键字如 HAVING
和 COUNT()
等。所以当我收到此错误时:
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
您需要 HAVING
在 GROUP 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