SQL Server Having子句

在本教學中,將學習如何使用SQL Server HAVING子句根據指定的條件篩選組。

HAVING子句通常與GROUP BY子句一起使用,以根據指定的條件列表過濾分組。 以下是HAVING子句的語法:

SELECT
    select_list
FROM
    table_name
GROUP BY
    group_list
HAVING
    conditions;

在此語法中,GROUP BY子句將行匯總為分組,HAVING子句將一個或多個條件應用於這些每個分組。 只有使條件評估為TRUE的組才會包含在結果中。 換句話說,過濾掉條件評估為FALSEUNKNOWN的組。

因為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;

SQL Server HAVING示例

下麵舉一些例子來理解HAVING子句的工作原理。

1. HAVING子句與COUNT函數示例

請參閱示例資料庫中的以下orders表:

以下聲明查找每年至少下過兩個訂單的客戶:

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的所有客戶。

2. HAVING子句與SUM()函數的例子

請考慮以下order_items表:

以下語句查找淨值大於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;

執行上面查詢語句,得到以下結果:

在這個例子中:

  • 首先,SUM函數計算銷售訂單的淨值。
  • 其次,HAVING子句過濾淨值小於或等於20000的銷售訂單。

3. HAVING子句與MAX和MIN函數的示例

請參閱以下products表:

以下語句首先查找每個產品類別中的最大和最小價格。 然後,它篩選出最大價格大於4000或最小價格小於500的類別:

SELECT
    category_id,
    MAX (list_price) max_list_price,
    MIN (list_price) min_list_price
FROM
    production.products
GROUP BY
    category_id
HAVING
    MAX (list_price) > 4000 OR MIN (list_price) < 500;

執行上面查詢語句,得到以下結果:

4. HAVING子句與AVG()函數示例

以下語句查找平均價格介於5001000之間的產品類別:

SELECT
    category_id,
    AVG (list_price) avg_list_price
FROM
    production.products
GROUP BY
    category_id
HAVING
    AVG (list_price) BETWEEN 500 AND 1000;

執行上面查詢語句,得到以下結果:


上一篇: SQL Server數據分組 下一篇: SQL Server子查詢語句