viernes, 22 de febrero de 2013

SQLite. La Clausula condicional CASE.

Retomando la importancia que tiene sqlite, ya que es el Motor de Base de datos más usado en dispositivos móbiles y sistemas embebidos.

¿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.html

Pero la explicación lo dejamos para después.

Suerte.

@pata_de_jaguar





No hay comentarios: