考虑以下设计的SQL语句:
SELECT e.job_title,
CASE WHEN e.is_full_time = 'Y' THEN e.name || ' full time' ELSE e.name || ' part time' END,
SUM(c.monterary_value)
FROM employee e
INNER JOIN car c ON c.employee_id = e.id
GROUP BY e.job_title,
e.is_full_time,
e.name;
为什么e.is_full_time
是必需的,因为分组依据结果汇总而非汇总?
答案 0 :(得分:2)
假设在您的数据中有两个具有相同名称但不同is_full_time
值的记录 - 应该在select子句中评估哪一个?为了避免出现任何违规或推定的可能性,SELECT
中的所有表达式都必须位于GROUP BY
或聚合中。 某些系统会更灵活一点,例如,在组中选择 first 结果,或者任意选择一个,但大多数企业级数据库都会强制执行此要求。 / p>
避免使用不必要的GROUP BY
表达式的一种方法是使用子查询:
SELECT e.job_title,
CASE WHEN e.is_full_time = 'Y' THEN e.name || ' full time' ELSE e.name || ' part time' END,
c.monterary_value
FROM employee e
INNER JOIN (
SELECT employee_id, SUM(monterary_value) monterary_value
FROM car
GROUP BY employee_id ) c
ON c.employee_id = e.id
答案 1 :(得分:0)
SQL在GROUP BY
之前执行SELECT
,所以如果它在SELECT
子句中看到一个非聚合列,而GROUP BY
子句中没有它,那么它抱怨。