这是一组更大的表格,但遗漏的细分是我有两个表格employees
和profits
。每次在公司中获利时,它都会被添加到利润中并引用产生利润的员工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用于制作列的任何单词)
是否有任何方法可以让我的工作成功吗?
答案 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
上查看
你也可以在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
上查看