首页 > 解决方案 > 使用带有 where 子句的 group by 时出错

问题描述

我正在尝试获取具有以下详细信息的销售人员列表 EmpId,连续 3 年获得 A 级的销售人员。

我编写了以下查询,但出现错误。

SELECT salesman, empid
FROM Sales_temp
where rating = 'A'
AND(select max(year), min(year) from Sales_temp 
 having (max(year)-min(year) = 3))
AND Count(year)=3  

为了过滤连续 3 年的“A”评级数据,我使用了以下逻辑:

A 评级的最大(年)减去 A 评级 = 3 和计数(年)=3 的最小(年)之差。但是,我收到一个错误:

标量子查询不能超过一列

请建议。

标签: mysqlsql

解决方案


我认为在 MySQL 中执行此操作的唯一方法是两次自行加入您的表,然后由销售人员汇总。然后,断言推销员是否至少有一条记录连续三个 A 评级:

SELECT
    s1.salesman, s1.empid
FROM Sales_temp s1
INNER JOIN Sales_temp s2
    ON s1.empid = s2.empid AND s2.year = s1.year + 1
INNER JOIN Sales_temp s3
    ON s2.empid = s3.empid AND s3.year = s2.year + 1
GROUP BY
    s1.salesman, s1.empid
HAVING
    SUM(CASE WHEN s1.rating = 'A' AND s2.rating = 'A' AND s3.rating = 'A'
             THEN 1 ELSE 0 END) > 0;

演示

中间连接表会很丑陋,但可以说它让每条记录Sales_temp有机会与下一年配对,然后是后年配对。如果可能出现三重,并且所有三个评级都是A质量,那么该推销员将出现在结果集中。


推荐阅读