在select列规范中使用CASE通过别名引用聚合结果

时间:2015-01-11 21:33:13

标签: mysql aggregate alias

这是一组更大的表格,但遗漏的细分是我有两个表格employeesprofits。每次在公司中获利时,它都会被添加到利润中并引用产生利润的员工ID,我会执行案例检查以在自定义列中显示任意值。

架构: http://sqlfiddle.com/#!2/aad19

当我提取员工列表时,我通过子查询生成所有属于他们的利润: SELECT firstname, lastname, (SELECT SUM(amount) FROM {利润{1}} {利润{1}}

产生以下列:

WHERE profits.employee_id=employees.id) AS

现在,我需要根据利润值将自定义列设置为值。如果利润是employees表中的常规列而不是子查询的结果,我只会这样做:

FROM employees {利润{1}} {利润{1}} {利润{1}} {利润{1}}

您可以看到这会创建一个"评级"结果集中的别名列,我可以根据我想要的任何条件有条件地设置,具体取决于用户的利润或利润。我将此数据的结果发送给我们无法控制的第三方应用程序,只需显示列"评级"因此,我需要预先填充"没有利润"或"达到/超过要求"。

然而,我很沮丧地发现你不能在这种情况下使用CASE,因为它抱怨评级列不存在,因为它是推断的(或者mysql用于制作列的任何单词)

是否有任何方法可以让我的工作成功吗?

1 个答案:

答案 0 :(得分:2)

您需要的查询只是一个简单的LEFT JOIN,因为您必须使用employee显示每个profits。你的case语句IS NOT NULL也有一点错误,永远不会让'No Profits'条件成立。所以我解决了这个问题,尝试这个查询:

select firstname,
       lastname,
       CASE WHEN (profits>0 and profits <=100) 
               THEN 'Met Requirements'
            WHEN (profits>100) 
               THEN 'Exceeded Requirements'
            ELSE    'No Profits'
       END as rating
from
(
SELECT
    e.firstname,
    e.lastname,
    SUM(p.amount) profits
FROM employees e left join
     profits p on (e.`id` = p.`employee_id`)
GROUP BY
   e.firstname,
   e.lastname
) tbl

SQL Fiddle Demo

上查看

你也可以在SUM语句中使用聚合函数CASE只使用一个查询,但我认为它不像第一个带子查询的例子那样优雅。

SELECT
    e.firstname,
    e.lastname,
    CASE WHEN (SUM(p.amount)>0 and SUM(p.amount) <=100) 
               THEN 'Met Requirements'
            WHEN (SUM(p.amount)>100) 
               THEN 'Exceeded Requirements'
            ELSE    'No Profits'
       END as rating
FROM employees e left join
     profits p on (e.id = p.employee_id)
GROUP BY
   e.firstname,
   e.lastname

SQL Fiddle Demo 2

上查看