2012-06-03 16 views
5

tengo la siguiente consulta que me da la suma de las ventas:sumar una sentencia condicional

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

ahora tengo que añadir una resta condicional basada en ciertas monedas que se llevan a cabo los impuestos, algo como esto, en pseudocódigo :

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

¿Cómo crearía esta SUMA o subconsulta condicional?

Respuesta

3

Es posible aplicar el factor, mientras que la suma total:

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

CASE tiene dos formas. Éste comprueba si la expresión booleana dada después de WHEN se evalúa como verdadera. Si lo hace, devuelve las ventas reducidas en un 5 por ciento; si no lo hace, devuelve expresión después de ELSE. Puede combinar CUANDO ... ENTONCES pares. El primero que evalúa como verdadero devuelve una expresión después de ENTONCES.

que podría haber hecho esto como usted sugirió en una pregunta, restando impuestos de JPY y AUD, de la siguiente manera:

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

Pero no ayudaría a la consulta de ninguna manera.

+0

¡Gracias, esto es realmente el único que funciona, aunque no tengo suficiente comprensión de' CASE' para explicar por qué! – David542

+2

@ user1383058: Podría ver un ' Expresión CASE' como una forma extendida de una expresión 'IF()'. Pruebe [el manual en expresiones CASE] (http://dev.mysql.com/doc/refman/5.6/es/control-flow-functions.html # operator_case) para obtener más información. –

+0

@ user1383058 He ampliado mi respuesta. De nada. –

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

(TSQL o MySQL?)

+1

¿Esto va a funcionar? ¿Qué pasa si su suma contiene monedas jpy y usd? – meze

+0

Funcionará mágicamente;) heh Quizás es mejor: seleccione suma (ventas) - caso cuando (moneda en ('jpy', 'aud') luego (seleccione suma (ventas) de la tabla donde moneda entra ('jpy' , 'aud')) * .05 else 0 end. De lo contrario, tendría que caminar hacia una unión interna más compleja consigo misma para obtener una suma basada en otros valores. –

+0

Funcionará solo si encierra la caja en suma() ; de esta manera forzará la moneda en 'group by'. –

1

Creo que Alex es el justo. He asumido que no se pueden mezclar JPY y USD etc., así que tendrá que agrupar por moneda, es decir

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 

devoluciones

aud 9.50 
gbp 30.00 
jpy 38.00 
usd 20.00 

que deduce un 5% de la JPY y AUD TOTALES

2

Dado que sólo hay dos alternativas, también se puede utilizar la función IF():

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

Otro método sería utilizar la conversión booleana implícita a 0 o 1 así:

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

El currency IN ('jpy', 'aud') expresión booleana se convertiría implícitamente a 0 (cuando es falso) o 1 (cuando es verdadero), y eso daría como resultado sales * (1 - 0) o sales * (1 - 0.05), en consecuencia.

Cuestiones relacionadas