Vi è mai capitato di dover reperire una lista di date per incrociare i dati con un’altra tabella? Possibile che non esista una pseudo-tabella in Oracle che contenga tutte le date?
La pseudo tabella non esiste, ma possiamo simularla. L’istruzione seguente produce una tabella contenente gli ultimi 30 giorni (oggi escluso)
SELECT TRUNC(SYSDATE - LEVEL) AS GIORNO
FROM DUAL
CONNECT BY LEVEL <= 30
Questa tabella possiamo quindi utilizzarla come subquery in una estrazione più complessa:
SELECT CALENDARIO.GIORNO,
COUNT(CLIENTI.ID)
FROM (SELECT TRUNC(SYSDATE - LEVEL) AS GIORNO
FROM DUAL
WHERE (SYSDATE - LEVEL) <= SYSDATE
CONNECT BY LEVEL <= 30) AS CALENDARIO,
CLIENTI
WHERE TRUNC(CLIENTI.D_CREAZIONE) = CALENDARIO.GIORNO
GROUP BY CALENDARIO.GIORNO
Con questa query si ottiene il numero dei clienti creati per ogni giorno nell’ultimo mese. Si poteva certo fare più semplicemente raggruppando direttamente per CLIENTI.D_CREAZIONE, ma in questo caso non avremmo estratto i giorni senza clienti. Inoltre questo espediente può essere usato per calcolare in modo efficiente i record che esprimono un periodo (range):
SELECT CALENDARIO.GG,
COUNT(DIPENDENTI.ID)
FROM (SELECT TRUNC(SYSDATE) + LEVEL AS GG
FROM DUAL
CONNECT BY LEVEL <= 31) AS CALENDARIO,
DIPENDENTI
WHERE CALENDARIO.GG BETWEEN DIPENDENTI.INIZIO_FERIE
AND DIPENDENTI.FINE_FERIE
GROUP BY CALENDARIO.GG
Quest’ultima query mostra per ogni giorno il numero dei dipendenti che saranno in ferie.
Spero di poter essere stato utile a qualcuno (come lo sono stato per me), se ci fossero degli errori vi pregerei di segnalarmeli.
[ispirato da: Jim 2.0 - thanks to James.Pipe]