dimecres, 23 de gener del 2008

Similar a 'group by' però horitzontal en MySQL

Amb aquesta tècnica podreu totalitzar en columnes amb una única instrucció MySQL. Es tracta de fer servir la clausula CASE per a condicionar sobre quin camp es calcula.

L'exemple mostra un informes del número de taules que un usuari pot llegir i pot inserir obscuritzant el nom de l'usuari per raons que no venen al cas. Això és fa pq es pugui provar en qualsevol instal·lació MySQL doncs són taules de sistema.

mysql> SELECT md5(user) as Usuari,
count(case when (Select_priv='Y') then 1 end) as TaulesPotFerSelect,
count(case when (Insert_priv='Y') then 1 end) as TaulesPotFerInsert
from mysql.db
group by Usuari
order by Usuari

Aquest altre exemple és un resum d'IVA trimestral amb una columna per mes del paquet OpenSource Facturalux i bastant més profitòs ;-)
SELECT concat(year(fecha), '-', quarter(fecha),'T') as Trimestre,
sum(case when (month(fecha) in (1,4,7,10)) then totaliva end) as 1M,
sum(case when (month(fecha) in (2,5,8,11)) then totaliva end) as 2M,
sum(case when (month(fecha) in (3,6,9,12)) then totaliva end) as 3M,
sum(totaliva) as 'Total IVA'
from facturascli
group by Trimestre


La idea és la mateixa que a Similar a 'group by' però hortizontal en SQL DB/2 però per a MySQL.

Un tema a tenir en compte és el fet de que MySQL permet barbarismes a l'hora de codificar instruccions GROUP BY i això pot provocar resultats no dessitjats en els nostres SQL. Per a solucionar aquest aspecte, només cal activar el sql-mode ONLY_FULL_GROUP_BY i amb la sintaxi estricta treballarem amb absolut control del resultat.