Home
  • Tips
  • Report con alias di campo dinamici

Report con alias di campo dinamici

Tip scritto da john_revelator circa un anno fa

Utilizzo di funzioni come alias di campo tramite l'impiego di prepared statement.

Oggi mi sono imbattuto in un'esigenza un pò particolare e volevo condividere con voi la mia soluzione.
In pratica dovevo creare un semplice report relativo alle vendite di una serie di prodotti negli ultimi tre mesi.
L'unica "difficoltà" che si presentava era relativa all'impiego di alias dinamici. Non volevo infatti usare degli alias statici del tipo "mese attuale", "mese scorso", "due mesi fa" ma volevo che fossero sempre aggiornati al periodo di esecuzione della query stessa.

Qui di seguito un dump esemplificativo.

 1create table alias_dinamici(
 2id int not null auto_increment primary key,
 3id_prodotto int,
 4data_prodotto date,
 5prezzo decimal(4,2)
 6) engine = myisam;
 7
 8insert into alias_dinamici (id_prodotto,data_prodotto,prezzo)
 9values 
10(1,'2011-03-01',12.50),
11(2,'2011-03-14',18.50),
12(3,'2011-03-10',15.00),
13(3,'2011-03-25',19.50),
14(1,'2011-02-20',10),
15(1,'2011-02-28',15),
16(2,'2011-01-10',8.30),
17(3,'2011-01-27',8.30),
18(2,'2010-12-30',15),
19(2,'2010-12-30',10),
20(1,'2010-12-04',5),
21(3,'2010-12-12',15);

Dopo un attimo di empasse ho pensato che una prepared statement potesse venire incontro alle mie esigenze.

 1set @mese_corrente = date_format(curdate(),'`%b %Y`'),
 2    @mese_scorso = date_format(curdate() -interval 1 month,'`%b %Y`'),
 3    @due_mesi_fa = date_format(curdate() -interval 2 month,'`%b %Y`');
 4
 5set @str = concat("select id_prodotto,
 6           sum(if(date_format(data_prodotto,'%Y%m') = date_format(curdate(),'%Y%m'),prezzo,0)) as ",@mese_corrente,
 7         ",sum(if(date_format(data_prodotto,'%Y%m') = date_format(curdate() -interval 1 month,'%Y%m'),prezzo,0)) as ",@mese_scorso,
 8         ",sum(if(date_format(data_prodotto,'%Y%m') = date_format(curdate() -interval 2 month,'%Y%m'),prezzo,0)) as ",@due_mesi_fa,
 9             ' from alias_dinamici group by id_prodotto');
10prepare stmt from @str;
11execute stmt;

Questo è il risultato:

1+-------------+----------+----------+----------+
2| id_prodotto | Mar 2011 | Feb 2011 | Jan 2011 |
3+-------------+----------+----------+----------+
4|           1 |    12.50 |    25.00 |     0.00 |
5|           2 |    18.50 |     0.00 |     8.30 |
6|           3 |    34.50 |     0.00 |     8.30 |
7+-------------+----------+----------+----------+

Spostiamo a un giorno qualsiasi di febbraio la data del nostro computer e riproviamo la nostra query. In questo caso, come ci aspettavamo, il risultato comprenderà l'intervallo febbrario 2011 - dicembre 2010

1+-------------+----------+----------+----------+
2| id_prodotto | Feb 2011 | Jan 2011 | Dec 2010 |
3+-------------+----------+----------+----------+
4|           1 |    25.00 |     0.00 |     5.00 |
5|           2 |     0.00 |     8.30 |    25.00 |
6|           3 |     0.00 |     8.30 |    15.00 |
7+-------------+----------+----------+----------+

Nel caso volessimo i nomi dei mesi in italiano non dovremo far altro che settare a monte la variabile lc_time_names:

1set lc_time_names = 'it_IT';

  • Current rating: 0.0/5
  • 1
  • 2
  • 3
  • 4
  • 5

Tip precedente: Esecuzione dump in formato CSV (tabelle in engine MyIsam esportate in formato CSV)

Tip successivo: UNION / UNION ALL su campi int unsigned zerofill.

Cerca nel sito...
Ultime recipes

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL MySQL Report un tool di shell per tenere tutto sotto controllo

Un utilissimo tool di shell che effettua un dettagliato e comodo report su MySQL


Vai alla recipe

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL MySQLSniffer sniffare il traffico TCP di MySQL

Un utilissimo tool per sniffare il traffico Client/Server TCP/IP di MySQL


Vai alla recipe

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso myisamchk riparare file MyISAM

Verificare l'integrità, riparare gestire chiavi e memoria di tabelle MyISAM attraverso il file myisamchk


Vai alla recipe

Un tool per comprimere le tabelle MyISAM fino a oltre il 50% myisampack comprimere file MyISAM

Un tool per comprimere le tabelle MyISAM fino a oltre il 50%


Vai alla recipe

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun mysqlshow visualizzare le informazioni sul database MySQL

mysqlshow le info di base sui database, tabelle e colonne senza utilizzare alcun client


Vai alla recipe

Utilizzando UNION / UNION ALL su campi int unsigned zerofill,
ho notato che MysqlUNION / UNION ALL su campi int unsigned zerofill. di DebUsr
Vai al tip

Utilizzo di funzioni come alias di campo tramite l'impiego di prepared statementReport con alias di campo dinamici di john_revelator
Vai al tip

Può capitare che sia necessario eseguire un dump di database in formato Comma SeparatedEsecuzione dump in formato CSV (tabelle in engine MyIsam esportate in formato CSV) di ghigomatto
Vai al tip

E' possibile eseguire le query SQL contenute in un file di testo. Questo è utileEseguire le query da un file di testo di Sante Caserio
Vai al tip

Se vogliamo fare il backup di tutti i database con mysqldump, e ne abbiamo parecchiFare il backup di tutti i database di Sante Caserio
Vai al tip

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve,vorrei chiedervi un aiutino per una query che mi infastidisce un pò.
Ho 4 aiuto per una query! di fighterdorico Vai al topic

Salve a tutti.

Ho una tabella con lettere accentate.
Le lettere vengono visualizzate ordinamento tabelle di ditch Vai al topic

Salve a tutti.

Ho una tabella con lettere accentate.
Le lettere vengono visualizzate ordinamento tabelle di ditch Vai al topic