Generare un report essenziale tramite una semplice query SQL in MySQL

From RVM Wiki
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

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;

Riferimenti