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]