Generare un report essenziale tramite una semplice query SQL in MySQL
Jump to navigation
Jump to search
Per generare un report direttamente con una query MYSQL, utilizzare le funzioni
SUM() COALESCE() FORMAT() GROUP BY WITH ROLLUP
- La generazione dei subtotali è semplice, si fa con SUM()
- Attenzione: i campi da sommare vanno dati in pasto alla funzione COALESCE() che assegna al campo valore zero se è NULL, altrimenti i totali sono errati:
COALESCE(campo,0)
- Per formattare i campi con i separatori decimali, usare FORMAT()
- Per ottenere una riga finale con il totale delle colonne, usare
WITH ROLLUP
- Per scrivere la parola "Totale" nell'ultima riga, fare una SELECT sul campo corrispondente al raggrupamento usando la funzione:
ISNULL(campo_raggrupamento, "Totale")
- Esempio:
SELECT
IFNULL(campo_raggruppamento, 'Totale')
AS Raggruppamento,
FORMAT( SUM(COALESCE(valore1,0),2)
AS Valore1,
FORMAT( SUM(COALESCE(valore2,0),2)
AS Valore2
FORMAT(
SUM(COALESCE(valore1,0)) + SUM(COALESCE(valore2,0))
AS Totale_Raggruppamento
FROM
Tabella
GROUP BY
campo_raggruppamento
WITH ROLLUP
- Si ottiene una tabella del genere:
+--------------+-------+-------+---------------------+ |Raggruppamento|Valore1|Valore2|Totale_Raggruppamento| +--------------+-------+-------+---------------------+ |Pippo | 10 | 15 | 25| |Pluto | 3 | 2 | 5| |Paperino | 7 | 3 | 10| |Totale | 20 | 20 | 40| +--------------+-------+-------+---------------------+
Questa query può poi essere trasformata in tabella con un codice php tipo phpReportGen
- Se la query è più complicata, un esempio lo si trova qui mysql - NULL not generated in last line of a GROUP BY WITH ROLLUP query - Stack Overflow
SELECT
COALESCE(ELT(m,
'Gennaio', 'Febbraio', 'Marzo', 'Aprile',
'Maggio', 'Giugno', 'Luglio', 'Agosto',
'Settembre', 'Ottobre', 'Novembre', 'Dicembre'),
'TOTALE') as `Month`,
USD
FROM (
SELECT
MONTH(`fd_Data`) As m,
SUM(Tot_Ore_Lavoro) As USD
FROM verbalitabella
WHERE
`fd_Data`
BETWEEN
MAKEDATE(YEAR(CURDATE()), 1)
AND
LAST_DAY(MAKEDATE(YEAR(CURDATE()), 365))
GROUP BY
MONTH(`fd_Data`)
WITH ROLLUP) as sums;