mysql - 在选择列规范中使用 CASE 通过别名引用聚合结果

标签 mysql aggregate alias

这是一组更大的表格中的一部分,但简单的分割是我有两个表格,employeesprofits。每次公司赚取利润时,它都会添加到利润中,并引用赚取利润的员工 ID,然后我执行案例检查以在自定义列中显示任意值。

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

当我提取员工列表时,我通过子查询生成属于他们的所有利润总计: 选择 名, 姓, (选择总和(金额) 来自利润 WHEREprofits.employee_id=employees.id) AS利润 来自员工

这会产生以下列:

名字 姓 利润

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

选择 名, 姓, (选择总和(金额) 来自利润 WHEREprofits.employee_id=employees.id) AS利润 案件 WHEN (profitsIS NOT NULL) THEN '满足要求' 当(利润>100)那么“超出要求” 否则“没有利润” END 作为评级 来自员工

正如您所看到的,这在结果集中创建了一个“评级”别名列,我可以根据我想要的任何内容有条件地设置该列,具体取决于用户利润的多少或是否发生。我将此数据的结果发送到我们无法控制的第三方应用程序,并且仅按原样显示“评级”列,因此我需要预先填充“无利润”或“满足/超出要求” .

但是,我很沮丧地发现在这种情况下不能使用 CASE,因为它提示评级列不存在,因为它是推断出来的(或者 mysql 用于组成列的任何单词)

我有任何方法可以完成这项工作吗?

最佳答案

您需要的查询只是一个简单的 LEFT JOIN,因为您必须向每个员工显示他们的利润。另外,您的 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 上查看

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

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 上查看

关于mysql - 在选择列规范中使用 CASE 通过别名引用聚合结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27892355/

相关文章:

mysql:获取具有最大列值的别名的元组

mysql - 查询以选择帖子并标记当前用户是否喜欢其中的一些帖子

php - 在 laravel 中创建一个由管理员指定执行日期的计划任务

aggregate - CQRS sagas - 我理解对了吗?

python - pandas自定义聚合函数

mongodb - Mongoose 聚合内部查找按字段分组

git - 如何在 Git 别名中包含 --no-pager?

当 num_rows==0 时,php 循环重新开始

mysql - 从 influxdb 查询数据并将其存储到测量(表)中

sql-server - 将 SQL Server 实例重定向到新实例?