2014-09-12 255 views
0

以下代碼爲sumHours字段返回錯誤的值。它似乎準備sumHours字段,然後一旦GROUP BY運行,將總和加起來。使用兩個LEFT JOIN和GROUP BY時出現錯誤SUM

SELECT mmr_ID, mmr_projectName, SUM(mmr_hoursWorked.mmr_hoursWorked_hours) AS sumHours 
FROM mmr 
LEFT JOIN mmr_hoursWorked 
ON mmr.mmr_ID = mmr_hoursWorked.mmr_hoursWorked_project AND mmr_hoursWorked.mmr_hoursWorked_mm = "P90826" 
LEFT JOIN mmr_notes 
ON mmr.mmr_ID = mmr_notes.mmr_notes_MMR_ref AND mmr_notes.mmr_notes_author = "P90826" 
WHERE mmr_mmAssigned = "P90826" AND mmr_projectStatus != 1 OR mmr_notes.mmr_notes_author = "P90826" AND mmr_projectStatus != 1 
GROUP BY mmr_ID 

實效

mmr_ID - 35
mmr_projectName - 項目A
sumHours - 140.2

預期結果

mmr_ID - 35
mmr_projectName - 項目A
sumhours - 35.05

+2

請顯示樣本數據,預期結果和實際結果。另外,請編輯該問題,以便您的代碼顯示爲代碼。 html標籤看起來已經搞亂了。 – 2014-09-12 19:40:22

+2

那麼,你正在選擇每一列,然後只有一列進行分組。這種非ANSI行爲在MySQL中是允許的,如果您想要獲得一致的結果,那麼它並沒有什麼意義。 – Lamak 2014-09-12 19:40:52

+1

問題是,您的聯接會影響連接的行數增加。但是,無法修復查詢,因爲不清楚列的來源。 – 2014-09-12 19:46:59

回答

0

該問題已通過規範化數據庫得以解決。 mmr_notes表已集成到mmr_hoursWorked表中,因爲它只有一個唯一字段。

0

由於JOIN由於語句組合結果被返回,所以你應該分別處理聚合和連接。試試這個:

SELECT t.* 
FROM 
(
    SELECT mmr_ID, mmr_projectName, SUM(mmr_hoursWorked.mmr_hoursWorked_hours) AS sumHours 
    FROM mmr 
    LEFT JOIN mmr_hoursWorked 
    ON mmr.mmr_ID = mmr_hoursWorked.mmr_hoursWorked_project AND mmr_hoursWorked.mmr_hoursWorked_mm = 'P90826' 
    WHERE mmr_projectStatus != 1 AND mmr_mmAssigned = 'P90826' 
    GROUP BY mmr_ID, mmr_projectName, mmr_mmAssigned 
) t 
LEFT JOIN mmr_notes 
ON t.mmr_ID = mmr_notes.mmr_notes_MMR_ref 
WHERE mmr_notes.mmr_notes_author = 'P90826'; 
+0

解決方案提供冗餘記錄 - 可能在正確的位置添加UNIQUE語句會移動冗餘記錄?雖然這次正確地完成了小時數。一種不同的方法爲這個問題提供瞭解決方案。 – ck706 2014-09-15 19:19:05