这是我的查询:在GROUP使用SELECT'd Case语句的COLUMNNAME BY
SELECT d.DeptName, CASE WHEN e.WorkCity is NULL THEN 'Mobile'
ELSE 'Stationary'
END AS EmpType,
AVG(e.MonthlyPayScale) AS AvgMnthPay
FROM Department d, Employee e
WHERE d.DeptId = e.DeptId
GROUP BY d.DeptName, EmpType
ORDER BY d.DeptName, EmpType
这是我的输出,这似乎是正确的:
deptname | emptype | avgmnthpay
----------+------------+------------------------
EvanDept | Mobile | 7500.0000000000000000
MaxDept | Stationary | 11250.0000000000000000
PaulDept | Mobile | 5000.0000000000000000
PaulDept | Stationary | 12500.0000000000000000
(4 rows)
它通过部门名称和移动组/固定员工,并计算每个组员工的平均月薪。
据我了解,虽然,这是SQL查询的顺序:
FROM
WHERE
GROUP BY
SELECT
ORDER BY
所以GROUP BY语句发生 SELECT语句前。那么,为什么:
GROUP BY d.DeptName,的empType
知道有关的empType任何东西,这是在SELECT语句中的CASE语句声明?
所以基本上,为什么做我的代码工作时GROUP BY前评估SELECT?
我的SQL [扩展了'GROUP BY'子句](http://dev.mysql.com/doc/refman/5.7/en/group-by-handling.html)在一个方式的数量,这是其中之一(在页面的底部链接)。我不知道MySQL查询编译的内部工作原理,所以虽然你所说的操作顺序是正确的,(虽然缺少'HAVING'),但我无法准确解释扩展工作的原因。 – GarethD
使用的标记dbms。涉及到GROUP BY时,MySQL和Postgresql有很大不同。 – jarlh
一般提示(独立于dbms):'GROUP BY d.DeptName,e.WorkCity'。 – jarlh