2012-06-03 10 views
5

Ho la seguente query che mi dà la somma delle vendite:RIEPILOGO un'istruzione condizionale

SELECT SUM(sales) 
FROM 
    (SELECT sales FROM ...) combined 

ora ho bisogno di aggiungere una sottrazione condizionale basata su certe valute che portano fuori le tasse, qualcosa di simile, in pseudocodice :

SELECT SUM(sales) - (SUM(sales) IF currency IN ('jpy', 'aud') * 0.05) 
FROM 
    (SELECT sales FROM ...) combined 

Come creare questo SUM condizionale o sottoquery?

risposta

3

Si potrebbe applicare il fattore, mentre la somma:

SELECT SUM(CASE WHEN currency IN ('jpy', 'aud') 
       THEN sales * 0.95 
       ELSE sales 
      END) 
FROM combined 

CASE ha due forme. Questo controlla se l'espressione booleana data dopo WHEN diventa true. Se lo fa, restituisce le vendite ridotte del 5%; se non lo fa, restituisce espressione dopo ELSE. È possibile combinare QUANDO ... POI coppie. Il primo che valuta la vera espressione restituisce dopo THEN.

Potreste aver fatto questo come lei ha suggerito in una domanda, sottraendo TAX da JPY e AUD, come segue:

SELECT SUM(sales) 
    - ifnull (SUM(CASE WHEN currency IN ('jpy', 'aud') 
         THEN sales * 0.05 
        END), 0) 
FROM combined 

Ma non aiuterebbe la query in alcun modo.

+0

Grazie, questo è in realtà l'unico che funziona, anche se non ho abbastanza comprensione di' CASE' per spiegare perché! – David542

+2

@ user1383058: Puoi vedere un ' Espressione CASE' come forma estesa di un'espressione 'IF(). Prova [il manuale su espressioni CASE] (http://dev.mysql.com/doc/refman/5.6/it/control-flow-functions.html # operator_case) per saperne di più. –

+0

@ user1383058 Ho ampliato la mia risposta. Prego. –

1
select sum(sales) - case when (currency in ('jpy', 'aud') then (Sum(sales) * .05) else 0 end 

(TSQL o MySQL?)

+1

Funzionerà? Cosa succede se la tua somma contiene valute jpy e usd? – meze

+0

Funzionerà magicamente;) heh Forse è meglio - seleziona la somma (vendite) - caso quando (valuta in ('jpy', 'aud') quindi (seleziona la somma (vendite) dalla tabella in cui valuta in ('jpy' , 'aud')) * .05 else 0 end. Altrimenti dovresti camminare verso un join interno più complesso su se stesso per ottenere una somma basata su altri valori. –

+0

Funzionerà solo se racchiudi il caso in sum() In questo modo imporrà la valuta in 'group by'. –

1

Credo che Alex è solo di destra. Ho pensato che non è possibile mescolare JPY e USD ecc in modo avrete bisogno di gruppo per valuta, cioè

SELECT currency, 
     SUM(sales) * (1 - CASE WHEN currency IN ('jpy', 'aud') 
          THEN .05 -- 5% Tax 
         ELSE 
          0 -- No tax 
         END) 
FROM 
(
    SELECT 'aud' as currency, 10.00 as sales 
    UNION 
    SELECT 'usd' as currency, 20.00 as sales 
    UNION 
    SELECT 'gbp' as currency, 30.00 as sales 
    UNION 
    SELECT 'jpy' as currency, 40.00 as sales 
) salesdata 
GROUP BY currency 

Returns

aud 9.50 
gbp 30.00 
jpy 38.00 
usd 20.00 

Quali detrae 5% di sconto il JPY e AUD totali

2

Poiché ci sono solo due alternative, si potrebbe anche usare la funzione IF():

SELECT SUM(sales * IF(currency IN ('jpy', 'aud'), 0.95, 1)) 
FROM combined 

Un altro metodo sarebbe quello di utilizzare conversione implicita booleana per 0 o 1 come questo:

SELECT SUM(sales * (1 - currency IN ('jpy', 'aud') * 0.05)) 

Il L'espressione booleana currency IN ('jpy', 'aud') converte implicitamente in 0 (quando falso) o 1 (quando è true), e ciò risulterebbe in sales * (1 - 0) o sales * (1 - 0.05), di conseguenza.