Oracle Group By子句

在本教學中,您將學習如何使用Oracle GROUP BY子句將行記錄分組。

Oracle GROUP BY子句簡介

GROUP BY子句在SELECT語句中用於按行或運算式的值將行組合到分組匯總的行中。 GROUP BY子句為每個分組返回一行。

GROUP BY子句通常與AVG()COUNT()MAX()MIN()SUM()之類的集合函數一起使用。 在這種情況下,聚合函數返回每個分組的摘要資訊。 例如,給定幾個類別的產品,AVG()函數返回每個類別中產品的平均價格。

以下說明了Oracle GROUP BY子句的語法:

SELECT
    column_list
FROM
    T
GROUP BY
    c1,
    c2,
    c3;

GROUP BY子句出現在FROM子句之後。在有提供WHERE子句的情況下,GROUP BY子句必須放在WHERE子句之前。

GROUP BY子句按分組列中的值(如c1c2c3)對行進行分組。GROUP BY子句只能包含聚合或分組的列。

如果要指定應該一次計算的多個分組級別,請使用以下ROLLUP語法:

SELECT
    column_list
FROM
    T
GROUP BY
    ROLLUP(c1,c2,c3);

Oracle GROUP BY示例

我們將在示例資料庫中使用以下ordersorder_items表進行演示:

1. Oracle GROUP BY的基本示例

以下語句使用GROUP BY子句在orders表中查找唯一的訂單狀態:

SELECT
    status
FROM
    orders
GROUP BY
    status;

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

該語句與使用DISTINCT運算符的以下語句具有相同的效果:

SELECT
    DISTINCT status
FROM
    orders;

2. Oracle GROUP BY聚合示例

以下語句返回客戶的訂單數量:

SELECT
    customer_id, COUNT( order_id )
FROM
    orders
GROUP BY
    customer_id
ORDER BY
    customer_id;

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

在這個例子中,我們按客戶編號來分組訂單,並使用COUNT()函數返回每個組的訂單數量。

要獲得更有意義的數據,可以按以下方式將orders表與customers表一起連接:

SELECT
    name, COUNT( order_id )
FROM
    orders
INNER JOIN customers
        USING(customer_id)
GROUP BY
    name
ORDER BY
    name;

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

3. Oracle GROUP BY運算式示例

以下示例按年份對訂單進行分組,並返回每年訂單的數量。參考以下查詢語句 -

SELECT
    EXTRACT(YEAR FROM order_date) YEAR,
    COUNT( order_id )
FROM
    orders
GROUP BY
    EXTRACT(YEAR FROM order_date)
ORDER BY
    YEAR;

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

在這個例子中,我們使用EXTRACT()函數從訂單的日期中獲取年份資訊。

與前面的例子不同,這裏使用了一個在GROUP BY子句中返回年份的運算式。

4. Oracle GROUP BY帶有ROLLUP示例

以下語句計算銷售額並按customer_idstatus和(customer_idstatus)對其進行分組:

SELECT
    customer_id,
    status,
    SUM( quantity * unit_price ) sales
FROM
    orders
INNER JOIN order_items
        USING(order_id)
GROUP BY
    ROLLUP(
        customer_id,
        status
    );

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

在本教學中,您已學習如何使用Oracle GROUP BY子句將行記錄分組。


上一篇: Oracle Like子句 下一篇: Oracle Having子句