2012-01-04 25 views
25

Tôi đang tạo truy vấn cho báo cáo có nhiều điều kiện IF trên SUM. Tôi gặp sự cố với nhiều điều kiện IF trên SUM.Truy vấn tổng MYSQL với điều kiện IF

Đây là truy vấn:

SELECT SUM(`totalamount`) AS Total, 
SUM(`PayPalFee`) AS Fees, 
DATE(`TransactionDate`) AS `Day`, 
SUM(IF(PaymentType = "paypal", 1,0)) AS Paypal, 
SUM(IF(PaymentType = "check", 1,0)) AS Checks, 
SUM(IF(PaymentType = "credit card", 1,0)) AS CreditCard, 
COUNT(*) AS Entries 
FROM my_table 
WHERE TransactionDate between '2011-05-05' AND '2012-01-30' 
GROUP BY day 
ORDER BY `day` ASC 

Truy vấn này chỉ hoạt động tốt.

Khi tôi cố gắng thêm các tuyên bố SUM dưới đây có điều kiện:

SUM('TotalAmount'(PaymentType = "credit card", 1,0)) AS CreditCardTotal, 

này có điều kiện IF tuyên bố không ra.

Tôi có một cột được gọi là 'TotalAmount' và một cột được gọi là 'PaymentType' Tôi đang tìm cách tạo SUM của giao dịch thẻ tín dụng mỗi ngày, SUM của séc kiểm tra mỗi ngày, SUM của paypal giao dịch theo từng ngày. Tôi đã thử tạo truy vấn phụ nhưng điều này trả về một giá trị cho toàn bộ cột TotalAmount, không được chia nhỏ theo ngày.

Trả lời

62

Hãy thử với một CASE theo cách này:

SUM(CASE WHEN PaymentType = "credit card" THEN TotalAmount ELSE 0 END) AS CreditCardTotal, 

nên cung cấp cho những gì bạn đang tìm kiếm ...

+0

Tuyệt vời! Cảm ơn bạn, tôi không thể chấp nhận điều này được nêu ra nhưng tôi sẽ. –

+0

@aleroot là có bất kỳ sự khác biệt nào giữa 'SUM (CASE WHEN .. THEN .. ELSE .. END)' và 'SUM (IF (.., .., ..))' khi tôi muốn chỉ kiểm tra một điều kiện (nếu một số trường boolean là 1)? Ý tôi là, cái nào nên nhanh hơn? – NHG

+1

Có thể được thực hiện như một ví dụ: 'SUM (IF (PaymentType =" thẻ tín dụng ", TotalAmount, 0) AS CreditCardTotal,' – George

34

Làm thế nào về điều này?

SUM(IF(PaymentType = "credit card", totalamount, 0)) AS CreditCardTotal 
Các vấn đề liên quan