¿Como operar con columnas según condiciones en SQLite?
A veces nos encontramos que queremos operar(SUM, COUNT) con algunos campos de la misma forma en que se hace con Engines con una mayor implementación. En el caso de SQLite no existe la clausula IF en SELECT, así que usaremos la clausula CASE.
CASE WHEN x > y THEN a ELSE b END.
Se lee.
CUANDO_EL_CASO_SEA valorX ES_MAYOR_A valorY ENTONCES DEVOLVER valorA SINO DEVOLVER valorB FIN.
Mucho más simple: cuando el valor de X sea mayor que Y, entonces devuelve A, sino devuelve B.
Sean esto los datos:
Haremos una consulta, donde crearemos dos columnas con sumas condicionadas con otro campo. Para efectos de este ejemplo, el tipo 1 son ventas, 0 son descuentos. Agruparemos los datos por vendedor.
SELECT nombre, SUM(CASE WHEN tipo=1 THEN monto ELSE 0 END) AS 'ventas', SUM(CASE WHEN tipo=0 THEN monto ELSE 0 END) AS 'devoluciones' FROM ventas GROUP BY nombre
Iremos por partes:
SELECT nombre, /* Sumar (seleccionar monto cuando tipo sea igual a 1) = ventas */ SUM(CASE WHEN tipo=1 THEN monto ELSE 0 END) AS 'ventas', /* Sumar (seleccionar monto cuando tipo sea igual a 0) = devoluciones */ SUM(CASE WHEN tipo=0 THEN monto ELSE 0 END) AS 'devoluciones'
/* desde la tabla ventas */ FROM ventas /* Agruparlos por nombre */ GROUP BY nombre
El Resultado es:
También podremos obtener el resultados con varios SELECT, pero lo óptimo es de esta forma.
Algo más complejo:
SELECT MAX([recibos].[fecha]) AS 'mes',
COUNT([recibos].[codigo]) AS 'conteo',
UM(CASE WHEN [recibos].[tipo] = -1 THEN ([recibos].[total]) ELSE 0 END) AS 'ventas',
SUM(CASE WHEN [recibos].[tipo] = 1 THEN [recibos].[total] ELSE 0 END) AS 'compras'
FROM [recibos]
WHERE [recibos].[fecha] >= date('now','start of year')
GROUP BY strftime(\"%m\", [recibos].[fecha]) ORDER BY [recibos].[fecha]
Más info : http://www.sqlite.org/lang_expr.htmlPero la explicación lo dejamos para después.
Suerte.
@pata_de_jaguar
No hay comentarios:
Publicar un comentario