2012-01-04 19 views
25

Sto costruendo una query per un report con più condizioni IF su SUM. Sto avendo problemi con più condizioni IF su SUM.Query somma MYSQL con condizione IF

Ecco la domanda:

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 

Questa query funziona bene.

Quando provo ad aggiungere l'istruzione SUM sotto condizionale:

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

Questa istruzione IF condizionale fallisce fuori.

Ho una colonna denominata "TotalAmount" e una colonna denominata "PaymentType" Sto cercando di creare una SOMMA delle transazioni con carta di credito ogni giorno, una SOMMA delle transazioni di assegni per ogni giorno, una SOMMA del paypal transazioni di ogni giorno ,. Ho provato a creare una sottoquery ma questo restituisce un valore per l'intera colonna TotalAmount, non suddivisa per giorno.

risposta

62

Prova con un CASE in questo modo:

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

dovrebbe dare quello che stai cercando ...

+0

Fantastico! Grazie, non posso ancora accettarlo, ma lo farò. –

+0

@aleroot c'è qualche differenza tra 'SUM (CASE WHEN .. THEN .. ELSE .. END)' e 'SUM (IF (.., .., ..))' quando desidero controllare solo una condizione (se qualche campo booleano è 1)? Voglio dire, quale dovrebbe essere più veloce? – NHG

+1

Si potrebbe fare come un esempio: 'SUM (IF (PaymentType =" carta di credito ", TotalAmount, 0) AS CreditCardTotal,' – George

34

ne dici di questo?

SUM(IF(PaymentType = "credit card", totalamount, 0)) AS CreditCardTotal