gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:45:38 24 4
gpt4 key购买 nike

这是一组更大的表格中的一部分,但简单的分割是我有两个表格,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com