[SQL]La query del giorno

Immaginiamo di avere a disposizione una tabella che contenga le vostre vendite annuali, dei campi che contengono per ciascuna vendita l'importo lordo e ivato e che tutte le date siano espresse nel formato unix timestamp (nel caso non sappiate cosa sia, fate riferimento a questo sito che ve lo spiega e vi fornisce un'applicazioncina web per fare la conversione di formato).

Si vuole produrre una query che dia come risultato dei record i cui campi della tabella sono:
  • anno di riferimento per le spese;
  • Totale vendite per quell'anno;
  • Totale fatturato lordo;
  • Totale fatturato ivato.
Ovviamente si potrebbe fare una semplice query del sito select * from vendite where [conditions...] e gestire tutto via PHP, ma costringerebbe ad impiegare varie variabili per il conteggio dei vari dati per il calcolo del fatturato lordo e di quello ivato, dato derivato.

Però volevo che facesse tutto MySQL di modo da semplificare al massimo la gestione del risultato con PHP. Quindi ecco la query finale:
select count(*) as totFatture,
@totLordo := (select truncate(sum(fatturatoLordo),2) from table
where [conditions...]
and data between UNIX_TIMESTAMP('2007/01/01') and
unix_timestamp('2007/12/31')) as totLordo,
@totIva := @totLordo + (select truncate(sum(fatturatoIvato),2) as totIva from
table where [conditions...]
and data between UNIX_TIMESTAMP('2007/01/01')
and unix_timestamp('2007/12/31')) as totIva,
@first := 2007 as anno
from table where [conditions...] and data
between UNIX_TIMESTAMP('2007/01/01') and unix_timestamp('2007/12/31')
group by anno
UNION
select count(*) as totFatture,
@totLordo := (select truncate(sum(fatturatoLordo),2) from table
where [conditions...] between
UNIX_TIMESTAMP('2008/01/01') and unix_timestamp('2008/12/31'))
as totLordo,
@totIva := @totLordo + (select truncate(sum(fatturatoIvato),2) from fatture
where [conditions...] and data
between UNIX_TIMESTAMP('2008/01/01') and
unix_timestamp('2008/12/31')) as totIva,
@second := 2008 as anno
from tablewhere [conditions...] and data between
UNIX_TIMESTAMP('2008/01/01') and unix_timestamp('2008/12/31')
group by anno

Se vi vengono in mente ottimizzazioni, non esitate a riferirle, per quei pochi dati di cui disponete :) A me è stato utile per imparare l'uso delle variabili in SQL ,della funzione unix_timestamp per il calcolo delle spese per anno e di truncate, che semplicemente tronca un numero alla i-esima cifra decimale specificata come secondo argomento, sebbene non arrotondi, ma semplicemente tronchi il numero (poco male alla fine).

0 comments:

Byte Strike Blog - Designed by Posicionamiento Web | Bloggerized by GosuBlogger