2017-02-16 23 views
0

我試圖計數tc.personnel_id的結果,如果有超過1個結果,那麼輸出是1.然後最後,它會得到總和。但是當我執行這段代碼時,我得到了「無效的組功能使用」錯誤。任何幫助將不勝感激。MySQL獲取和無效的組功能使用

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

不知道在MySQL這樣的事情,而是你有兩個非'SELECT'中的聚合字段,而'GROUP BY'只提到一個。 – yeputons

+0

你不能嵌套像SUM(COUNT(...))' –

回答

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)可以rewriten到SUM(1)COUNT(*)

SUM(IF(tpi.returningCrew = 0, 1, 0)卡恩也被改寫爲SUM(tpi.returningCrew = 0)

而且SUM(IF(tpi.returningCrew = 1, 1, 0))到​​3210

所以最終的選擇可能是:

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 [..] 
+0

聚合函數謝謝。我根據自己的需求修改了一些代碼,現在正在工作。 –