MySQL获取和无效使用组功能

时间:2017-02-16 01:42:05

标签: mysql

我试图计算tc.personnel_id的结果,如果有超过1个结果,则输出为1.然后最后,它将得到总和。但我得到了一个"无效使用群组功能"执行此代码时出错。任何帮助将不胜感激。

SELECT  tv.id,
        tv.vesselName,
        SUM(IF(tpi.returningCrew = 0, 1, 
                IF(
                    COUNT(tc.personnel_id) > 1, 1, 0)
                )
            ) AS ex_crew,
        SUM(IF(tpi.returningCrew = 1, 1, 0)) AS new_hire
FROM tbl_vessels AS tv
LEFT JOIN tbl_personnel_info AS tpi
ON tv.id = tpi.lastJoinedVsl
LEFT JOIN tbl_contracts AS tc
ON tpi.id = tc.personnel_id
LEFT JOIN tbl_management AS tm
ON tm.id = tv.management
WHERE tpi.emp_status = 'ON-BOARD'
AND tc.status = 'ACTIVE'
AND tv.trade_route = 'WORLD WIDE'
AND tm.management = 'TOKYO'
GROUP BY vesselName;

1 个答案:

答案 0 :(得分:1)

无法嵌套聚合函数。所以像SUM(.. COUNT(..) ..)这样的东西是不可能的。您可以尝试这样的事情:

SELECT  tv.id,
        tv.vesselName,
        CASE WHEN COUNT(tc.personnel_id) > 1
            THEN SUM(IF(tpi.returningCrew = 0, 1, 1)
            ELSE SUM(IF(tpi.returningCrew = 0, 1, 0)
        END AS ex_crew,
        SUM(IF(tpi.returningCrew = 1, 1, 0)) AS new_hire
FROM [..]

SUM(IF(tpi.returningCrew = 0, 1, 1)可以重写为SUM(1)COUNT(*)

SUM(IF(tpi.returningCrew = 0, 1, 0)也可以重写为SUM(tpi.returningCrew = 0)

SUM(IF(tpi.returningCrew = 1, 1, 0))SUM(tpi.returningCrew = 1)

所以最终的选择可能是:

SELECT  tv.id,
        tv.vesselName,
        CASE WHEN COUNT(tc.personnel_id) > 1
            THEN COUNT(*)
            ELSE SUM(tpi.returningCrew = 0)
        END AS ex_crew,
        SUM(tpi.returningCrew = 1) AS new_hire
FROM [..]