我看到一條語句,上面寫著“當使用聚合函數(COUNT(),CASE表示條件邏輯)時,GROUP BY子句應該包括所有non-aggregated列,這些列都是selected.”,這是什么原因?
例如,我有一個查詢,其中這是不正確的:
select
e.first_name,
e.last_name,
count(o.order_id) as num_orders,
(case when shipped_date <= required_date then 'On Time' else 'Late' end)
as shipped
from employees e
join orders o on e.employee_id = o.employee_id
group by e.employee_id
order by last_name, first_name, num_orders Desc
但這是正確的:
select
e.first_name,
e.last_name,
count(o.order_id) as num_orders,
(case when shipped_date <= required_date then 'On Time' else 'Late' end)
as shipped
from employees e
join orders o on e.employee_id = o.employee_id
group by e.first_name,e.last_name,shipped
order by last_name, first_name, num_orders Desc
在您的情況下,如果有兩個不同的姓氏分配給同一個員工ID,您希望數據庫在按員工ID分組后返回哪個姓氏?
這就是為什么SQL要求SELECT語句中不屬于聚合函數的所有列都必須包含在GROUP BY子句中,以確保結果集中的每一行都是唯一定義的,并確保SQL查詢在邏輯上是一致和明確的。