HAVING 子句通常与[GROUP BY]子句一起使用,以根据指定的条件列表过滤分组。 以下是 HAVING 子句的语法:
SELECT
select_list
FROM
table_name
GROUP BY
group_list
HAVING
conditions;
在此语法中, GROUP BY 子句将行汇总为分组, HAVING 子句将一个或多个条件应用于这些每个分组。
只有使条件评估为 TRUE 的组才会包含在结果中。 换句话说,过滤掉条件评估为 FALSE 或 UNKNOWN 的
组。
因为SQL Server在 GROUP BY 子句之后处理 HAVING 子句,所以不能通过使用列别名来引用选择列表中指定的聚合函数。
SELECT
column_name1,
column_name2,
aggregate_function (column_name3) column_alias
FROM
table_name
GROUP BY
column_name1,
column_name2
HAVING
column_alias > value;
必须明确使用 HAVING 子句中的聚合函数表达式,如下所示:
SELECT
column_name1,
column_name2,
aggregate_function (column_name3) alias
FROM
table_name
GROUP BY
column_name1,
column_name2
HAVING aggregate_function (column_name3) > value;
HAVING子句与COUNT函数示例
以下声明查找每年至少下过两个订单的客户:
SELECT
customer_id, YEAR (order_date),
COUNT (order_id) order_count
FROM
sales.orders
GROUP BY
customer_id,
YEAR (order_date)
HAVING
COUNT (order_id) >= 2
ORDER BY customer_id;
在上面查询示例中
首先, GROUP BY 子句按客户和订单年份对销售订单进行分组。 COUNT() 函数返回每个客户每年
下达的订单数。
其次, HAVING 子句筛选出订单数至少为 2 的所有客户。
HAVING子句与SUM()函数的例子
以下语句查找净值大于 20000 的销售订单:
SELECT
order_id,
SUM (
quantity * list_price * (1 - discount)
) net_value
FROM
sales.order_items
GROUP BY
order_id
HAVING
SUM (
quantity * list_price * (1 - discount)
) > 20000
ORDER BY
net_value;
SQL
- List item