在 SQL 中,GROUP BY
?子句用于將結果集按一個或多個列進行分組。默認情況下,GROUP BY
?會按照列的自然順序(如字母順序或數字順序)進行排序。如果你需要按照自定義的排序規則對結果進行分組,可以使用?ORDER BY
?子句結合?CASE
?語句來實現。
假設你有一個?orders
?表,其中包含以下列:
-
order_id
?(訂單ID) -
customer_id
?(客戶ID) -
order_date
?(訂單日期) -
status
?(訂單狀態,如 'Pending', 'Shipped', 'Delivered', 'Cancelled')
你想按照?status
?列進行分組,但希望按照自定義的順序(如 'Pending', 'Shipped', 'Delivered', 'Cancelled')進行排序。
SELECT status,COUNT(*) AS order_count
FROM orders
GROUP BY status
ORDER BY CASE WHEN status = 'Pending' THEN 1WHEN status = 'Shipped' THEN 2WHEN status = 'Delivered' THEN 3WHEN status = 'Cancelled' THEN 4ELSE 5END;
解釋
-
GROUP BY status: 按照?
status
?列進行分組。 -
ORDER BY CASE: 使用?
CASE
?語句為每個?status
?分配一個自定義的排序值。-
'Pending'
?對應 1 -
'Shipped'
?對應 2 -
'Delivered'
?對應 3 -
'Cancelled'
?對應 4 -
其他狀態(如果有)對應 5
-
-
COUNT(*) AS order_count: 計算每個狀態下的訂單數量。
結果
查詢結果將按照自定義的順序對?status
?進行排序,并顯示每個狀態下的訂單數量。
注意事項
-
CASE
?語句中的排序值可以根據需要進行調整。 -
如果你有更多的自定義排序需求,可以在?
CASE
?語句中添加更多的?WHEN
?條件。 -
如果?
status
?列中有?NULL
?值,可以在?CASE
?語句中添加?WHEN status IS NULL THEN ...
?來處理。
通過這種方式,你可以靈活地控制?GROUP BY
?結果的排序順序,而不僅僅依賴于列的自然順序。