2011-07-29 25 views
12
SELECT 
    SUM(
     CASE 
      WHEN cumulative = 1 
      THEN percent 
      ELSE 0 
     END) 
FROM phppos_items_taxes; 

Teniendo en cuenta la declaración anterior hace este el siguiente:Mysql SUM con declaración de caso

mysql> select * FROM phppos_items_taxes; 
+---------+-----------+---------+------------+ 
| item_id | name  | percent | cumulative | 
+---------+-----------+---------+------------+ 
|  1 | Tax 1  | 8.00 |   0 | 
|  1 | Tax 2  | 10.00 |   1 | 
|  3 | Sales Tax | 8.00 |   0 | 
|  4 | Tax 1  | 20.00 |   0 | 
|  4 | Tax 2  | 20.00 |   0 | 
+---------+-----------+---------+------------+ 

hace esto resumir por ciento para cada fila que acumulado = 1. Si acumulado = 1, entonces se resume 0! .

Respuesta

25

Sí lo hace! Una consulta más corta y más limpio (en mi humilde opinión) sería utilizar IF declaración:

SELECT SUM(IF(cumulative = 1, `percent`, 0)) FROM phppos_items_taxes; 
+4

Shorter, sí, pero la sintaxis IF() no es ANSI SQL. Usar CASE aumenta la posibilidad de ser portátil, por lo que eso vale. –

+0

+1. También utilizo esta sintaxis con mysql pero AFAIK "sum (case when ..." es una solución más estándar. Edit. Cuando termino mi publicación, he visto la respuesta de Bill. :) –

+0

@ Bill: Sí, tienes razón. Estoy totalmente de acuerdo contigo. Sin embargo, hay tantas cosas en MySQL, que no son ANSI SQL, que no harán que el código SQL escrito para MySQL sea portátil de manera predeterminada. Lo más probable es que cuando la portabilidad llegue a cuestionar todas las consultas serán inspeccionadas, pero es genial que lo haya sacado a relucir, gracias. :) – Shef

7

Por qué no sólo para filtrar los artículos?

SELECT 
    SUM(ISNULL(percent, 0)) 
FROM 
    phppos_items_taxes 
WHERE 
    cumulative = 1 

En su caso se seleccionará cada fila y CASE declaración tiene que ser aplicado, yo creo con WHERE filtro sería significativamente más rápido porque cláusula WHERE ejecutar antes cláusula SELECT

+2

@Chris Muench: si la consulta no involucra otros factores, use esta solución, de hecho es mucho más rápida. :) – Shef