2013-01-17 3 views
0

이 질문은 내 이전 게시물과 관련이 있습니다. MySQL - Complicated SUMs inside QueryMySQL - 복잡 케이스/WHEN 조건 가능?

쿼리가 잘 작동하여 원하는만큼 총계를 합산합니다. NULL 값을 가진 레코드도 무시한다는 것을 알았습니다.

현재 쿼리가 아름답게 10 고객 레코드를 반환

SELECT c.*, 
     SUM(CASE WHEN billtype = 1 THEN total ELSE 0 END) totalpaid , 
     SUM(CASE WHEN billtype = 2 THEN total ELSE 0 END) totalowed , 
     SUM(total) AS totalbalance 
FROM 
    tbl_customers c 
    LEFT JOIN tbl_customers_bills b 
    ON c.customerid = = b.customerid 
    and billtype in (1,2) 
GROUP BY 
    c.customerid 

합니다. 데이터베이스를 확인하면 고객 레코드를 볼 수 있으며 열한 번째 테이블에는 tbl_customers_bills 테이블에 상관 레코드가 없습니다.

tbl_customers_bills 테이블에 존재하지 않는 레코드가 있어도 여전히 11 개를 모두 반환하고 싶습니다. (하지만 0으로 끝납니다.)

그런 상황이 얼마나 복잡한 지 알 수 있습니다. 는 여기에 내가 무엇을 시도했다입니다 : (아무 소용이)

SELECT c.*, 

    (CASE WHEN (total IS NULL) THEN totalpaid = 0 

     ELSE 
     SUM(CASE WHEN billtype = 1 THEN total ELSE 0 END) totalpaid , 
     SUM(CASE WHEN billtype = 2 THEN total ELSE 0 END) totalowed , 
     SUM(total) AS totalbalance 
     END) 

FROM 
    tbl_customers c 
    LEFT JOIN tbl_customers_bills b 
    ON c.customerid = = b.customerid 
    and billtype in (1,2) 
GROUP BY 
    c.customerid 
+0

당신이 우리에게 말하고 있지 않은 'WHERE' 조건이 있습니까? –

+0

'billtype'은 어느 테이블에 속합니까? –

+1

그리고 왜'='뿐만 아니라'= ='을 가지고 있습니까? –

답변

2

IFNULL하는 것에 대해 나는 매우 잘 완전히의 수 있습니다 어떻게하지만 난 당신이 단지 누락 생각 COALESCE

SELECT c.*, 
     COALESCE(SUM(CASE WHEN billtype = 1 THEN total ELSE 0 END), 0) totalpaid , 
     COALESCE(SUM(CASE WHEN billtype = 2 THEN total ELSE 0 END), 0 totalowed , 
     COALESCE(SUM(total), 0) AS totalbalance 
FROM 
    tbl_customers c 
    LEFT JOIN tbl_customers_bills b 
    ON c.customerid = = b.customerid 
    and billtype in (1,2) 
GROUP BY 
    c.customerid 

MySQL Reference

COALESCE (값, ...)

NULL이 아닌 첫 번째 값을 반환하거나 NULL이 아닌 값이 없으면 NULL을 반환합니다.

mysql> SELECT COALESCE (NULL, 1); -> 1
mysql> SELECT COALESCE (NULL, NULL, NULL); -> NULL

1

SELECT 
    c.*, 
    SUM(CASE WHEN billtype = 1 THEN IFNULL(total,0) ELSE 0 END) totalpaid , 
    SUM(CASE WHEN billtype = 2 THEN IFNULL(total,0) ELSE 0 END) totalowed , 
    SUM(total) AS totalbalance 
FROM 
    tbl_customers c 
    LEFT JOIN tbl_customers_bills b 
    ON c.customerid = = b.customerid 
    and billtype in (1,2) 
GROUP BY 
    c.customerid