Creato da pastuweb.com
Share My Page
My Social Accounts
Account FaceBook Account LinkedIn Account Twitter Account Google Plus Account Git Hub

L'utente oggigiorno può interrogare il data warehouse mediante strumenti di vario tipo:

  • ambiente controllato di query (struttura parametrica)
  • strumenti specifici di query e generazioni rapporti (tecnica point & click, creazione arbitraria di query)
  • strumenti di data mining (uso di SQL esteso)
Lo standard SQL-99 (SQL3) ha esteso la clausola GROUP BY di SQL. Ora è possibile, solo in alcuni DBMS (es: Oracle), generare dei totali parziali e cumulativi, creare delle medie mobili, mediane ecc.

Esempio di tabella (Vendite):

Città Mese Importo
Milano 7 110
Milano 8 10
Milano 9 70
Milano 10 90
Milano 11 35
Milano 12 135
Torino 7 70
Torino 8 35
Torino 9 80
Torino 10 95
Torino 11 50

 

 

 

 

 

 

 

 

 

 

Query in SQL Esteso

Visualizzare per ogni città e mese: l'importo delle vendite, la media rispetto al mese corrente e ai due mesi precedenti, separatamente per ogni città.

SELECT Città, Mese, Importo,

AVG(Importo) OVER (PARTITION BY Città ORDER BY Mese ROWS 2 PRECEDING) as MediaMobile 

FROM Vendite

E' necessario specificare l'ordinamento, perchè l'aggregazione richiesta utilizza righe in modo ordinato.

Quando la finestra di aggregazione è incompleta, il calcolo è effettuato sulla parte presente.

E' possibile, a differenza del semplice GROUP BY, specificare più finestre di calcolo diverse.

Varianti:

ROWS 2 FOLLOWING = i-2 i-1 i

ROWS BETWEEN 1 PRECEDING AND 1 FOLLOWING = i-1 i i+1

ROWS UNBOUNDED PRECEDING = tra l'inizio della partizione e la riga corrente

ROWS UNBOUNDED FOLLOWING = tra la fine della partizione e la riga corrente

RANGE 2 MONTH PRECEDING = utile nel caso di buchi nei dati (dati sparsi)

 
Visualizzare, per ogni città e mese: l'importo delle vendite, l'importo cumulativo delle vendite al trascorrere dei mesi separatamente per ogni città.
 
SELECT Città, Mese, Importo, 
 
SUM(Importo) OVER (PARTITION BY Città ORDER BY Mese ROWS UNBOUNDED PRECEDING) as SommeCumul
 
FROM Vendite
 
 

Visualizzare, per ogni città e mese: l'importo delle vendite, l'importo totale delle vendite sul periodo completo per la città corrente.

SELECT Città, Mese, Importo, 
 
SUM(Importo) OVER (PARTITION BY Città) as ImpTotale
 
FROM Vendite
 

Visualizzare, per ogni città e mese: l'importo delle vendite, il rapporto tra l'importo della riga corrente per le vendite e il totale complessivo, il rapporto tra l'importo della riga corrente per le vendite e il totale complessivo per città, il rapporto tra l'importo della riga corrente per le vendite e il totale complessivo per mese.

SELECT Città, Mese, Importo, 
 
Importo/SUM(Importo) OVER () as PercTotale,
Importo/SUM(Importo) OVER (PARTITION BY Città) as PercCittà,
Importo/SUM(Importo) OVER (PARTITION BY Mese) as PercMese,
 
FROM Vendite

 

E' possibile abbinare l'uso di finestre (PARTITION) con il raggruppamento eseguito dalla clausola GROUP BY. La "tabella temporanea" generata dall'esecuzione della clausola GROUP BY, diviene l'operando a cui applicare le operazione definite per la finestra.

Si supponga che la tabella Vendite contenga a informazioni sulle vendite con granularità giornaliera. Visualizzare per ogni città e mese: l'importo delle vendite, la media rispetto al mese corrente e ai due mesi precedenti, separatamente per ogni città.

SELECT Città, Mese, SUM(Importo) as TotMese, 

AVG(SUM(Importo)) OVER (PARTITION BY Città ORDER BY Mese ROWS 2 PRECEDING) as MediaMobile

FROM Vendite, ...

WHERE ....

GROUP BY Città, Mese

Il SUM(Importo) all'interno di AVG() va ad agire sul GROUP BY.

 

RANKING

Visualizzare, per ogni città nel mese di dicembre: l'importo delle vendite e la posizione nella graduatoria.

Non occorre partizione. Se avessi avuto più mesi = 12 per ogni città avrei dovuto fare SOLO uno SUM(Importo) e GROUP BY Città.

SELECT Città, Importo, o [Città, SUM(Importo)]

RANK() OVER (ORDER BY Importo DESC) o [ORDER BY SUM(Importo) DESC ]

FROM Vendite

WHERE MEse = 12

RANK() : calcola la posizione, lasciando intervalli vuoti successivi alla presenza di "pari merito".

DENSERANK(): calcola la posizione, senza lascaire intervalli vuoti successivi alla presenza di "pari merito".

Average (1 Vote)
The average rating is 5.0 stars out of 5.