2014-09-12 2 views
0

다음 코드는 sumHours 필드에 대해 잘못된 값을 반환합니다. GROUP BY가 실행되면 sumHours 필드를 준비하는 것처럼 보입니다.두 개의 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 - 프로젝트
sumHours - 140.2

예상 결과

mmr_ID - 35
mmr_projectName - 프로젝트
sumHours - 35.05

+2

샘플 데이터, 예상 결과 및 실제 결과를 보여주십시오. 또한 코드가 코드로 나타나도록 질문을 편집하십시오. html 태그가 엉망인 것처럼 보입니다. –

+2

글쎄, 모든 열을 선택한 다음 하나씩 만 그룹화합니다. 이 비 ANSI 동작은 MySQL에서 허용되며, 일관된 결과를 원한다면 실제로는 의미가 없습니다. – Lamak

+1

조인은 조인에 영향을주는 행 수를 곱하는 문제입니다. 그러나 열이 어디서 왔는지 불분명하기 때문에 쿼리를 수정할 수 없습니다. –

답변

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

관련 문제