2017-12-29 49 views
3

두 개의 테이블 'authorization'과 'transaction'이 있습니다.MySQL SUM 0에 대한 결과가 없습니다. JOIN

인증 테이블

Auth_ID | User_ID | Auth_Hours 
------------------------------- 
5  | 1  | 60 
6  | 2  | 40 
7  | 3  | 50 

거래 테이블

Auth_ID | User_ID | Used_Hours 
------------------------------- 
5  | 1  | 5 
6  | 2  | 2 
5  | 1  | 20 
6  | 2  | 17 
5  | 1  | 11 
6  | 2  | 9 

나는 내 쿼리 트랜잭션 테이블에서 AUTH_IDUSER_ID에 의해 Used_Hours와 그룹을 요약하고 싶다.

QUERY

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, SUM(t.Used_Hours) 
FROM AUTHORIZATION a 
JOIN TRANSACTION t 
on a.Auth_ID = t.Auth_ID 
and a.User_ID = t.User_ID 
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours 

실제 결과

: - 여기 캐치 나는 또한 0으로 자신의 Auth_Hours 중 하나를 사용하지 않은 사용자는 아래를 참조를 표시하는 쿼리 결과를 원하는
Auth_ID | User_ID | Auth_Hours | Total Hours Used 
------------------------------------------------- 
5  | 1  | 60   | 36 
6  | 2  | 40   | 28 

는 결과 구함

Auth_ID | User_ID | Auth_Hours | Total Hours Used 
------------------------------------------------- 
5  | 1  | 60   | 36 
6  | 2  | 40   | 28 
7  | 3  | 50   | 0 

나는 쿼리가 비교적 간단하다고 생각합니다.

+5

질문을 편집하고 귀하의 질의를 표시하십시오. 그런 다음 'JOIN'을 LEFT JOIN으로 바꿉니다. –

+0

내 검색어를 입력했습니다. 함께 시도해 보겠습니다. LEFT JOIN –

답변

1

문은 INNER JOIN의 바로 가기로 두 테이블에서 모두 일치하는 값을 가진 레코드를 반환합니다. 레코드와 다른 테이블의 일치하는 레코드를 반환하려면 외부 조인 (LEFT [OUTER] JOIN 또는 RIGHT [OUTER] JOIN)을 사용해야합니다. 그럼 당신은 0으로 NULL들 변환 할 IFNULL() 또는 COALESCE() 기능을 사용할 수 있습니다 : 나는 (당신이 당신의 예에서 사용 된) 총 필드에 이름으로 공백이있는 문자열을 할당하는 작은 따옴표를 사용

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, IFNULL(SUM(t.Used_Hours), 0) AS 'Total Hours Used' 
FROM authorization a 
LEFT JOIN transaction t ON a.Auth_ID = t.Auth_ID AND a.User_ID = t.User_ID 
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours 

공지 사항 . 이것은 모든 데이터베이스에서 작동합니다. MySQL에서는 back tick을 사용할 수도 있지만 이는 MySQL에서만 작동합니다.

여기는 good illustration about the different types of joining tables입니다.

+0

도움을 주셔서 감사합니다! IFNULL()은 ISNULL()의 MySQL과 동일합니다. 어느 쪽이든, 당신은 락. 답변을 업데이트하면 동의 할 것입니다. –

+0

예, MySQL에서는'IFNULL()'함수 또는'COALESCE()'함수를 사용할 수 있습니다. –

0

이 쿼리는 모든 MySQL 엔진 또는 버전에서 작동합니다. 다음 쿼리를 사용하십시오 :

SELECT a.Auth_ID, a.USER_ID, a.Auth_Hours, CASE COUNT(t.Used_Hours) WHEN 0 THEN 0 ELSE SUM(t.Used_Hours) END AS 'Total Hours Used' 
FROM authorization a 
LEFT JOIN TRANSACTION t ON a.Auth_ID = t.Auth_ID AND a.User_ID = t.User_ID 
GROUP BY a.Auth_ID, a.USER_ID, a.Auth_Hours 
+0

COUNT()는 실제 합계가 아닌 인스턴스 수만 기록합니다. 그 밖의 경우에는 sum (t.Used_Hours)을 반환 할 때 –

+0

을 반환합니다. 도움이된다면 말해줘. –