我试图计算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;
答案 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 [..]