在本教學中,您將學習如何使用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
子句按分組列中的值(如c1
,c2
和c3
)對行進行分組。GROUP BY
子句只能包含聚合或分組的列。
如果要指定應該一次計算的多個分組級別,請使用以下ROLLUP
語法:
SELECT
column_list
FROM
T
GROUP BY
ROLLUP(c1,c2,c3);
Oracle GROUP BY示例
我們將在示例資料庫中使用以下orders
和order_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_id
,status
和(customer_id
,status
)對其進行分組:
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
子句將行記錄分組。