Query SQL per intervallo di date
-
21-08-2019 - |
Domanda
Consente di inquadrare ancora una volta la questione ---
table1{date, bID, sName, fID}
{11/05,B1,A1,P1}
{12/05,B2,A2,P2}
{13/05,B1,A3,P1}
{15/05,B3,A4,P1}
{16/05,B1,A5,P2}
{19/05,B1,A6,P2}
Questa è la tabella ei dati memorizzati nella tabella viene specificato anche ...
Ora la domanda che voglio è che: -
A seconda del FID (diciamo, è selezionato P1) dovrebbe visualizzare i dati dalla tabella di dire da 11 / 05-17 / 05 (nessuna data dovrebbe essere persa). I dati recuperati è la seguente: -
11/05,B1,A1
12/05,--,--
13/05,B1,A3
14/05,--,--
15/05,B3,A4
16/05,--,--
17/05,--,--
Vengono visualizzati i dati recuperati per un particolare FID (diciamo P1) .. Explaning il risultato ...
1) è visualizzata tutti i dati da 11 / 05-17 / 05 dove FID è P1, se non v'è alcuna data nel database, allora anche dovrebbe visualizzare valore nullo per quella data (ie14 / 05 data non c'era nel database, ma ancora visualizzato con un valore nullo) ..
2) se FID per quella particolare data non è P1, quindi anche memorizzare un valore nullo in set di risultati ..
Atlast i dati vengono recuperati nel set di risultati ,, ed elaborati ulteriormente ..
Quindi, voglio scrivere la query per questo problemm ,, è possibile ..
Soluzione
Nessun codice qui, solo il mio pensiero.
È necessario creare una tabella temporanea con date che vanno dal inizierà data per una data di fine, inclusiva. E poi left join
table1
con quella tabella temporanea sul date
colonna più aggiungere where fID = ?
.
Altri suggerimenti
Come l'altra risposta qui cita, una tabella con tutte le date in esso, e un LEFT JOIN
è quello che ti serve.
Diciamo che avete questa tabella:
CREATE TABLE table1
{
date DATETIME
bID VARCHAR(10),
sName VARCHAR(10),
fID VARCHAR(10)
}
e quindi questa data-tabella:
CREATE TABLE dates
(
dt DATETIME
)
e in questa tabella è necessario avere tutte le date per il campo che si desidera visualizzare. Di solito si popola con un paio di anni in entrambe le direzioni, ma che sta a voi.
Nota: Per semplicità, non mi sono preoccupato con le chiavi primarie in entrambe le tabelle. Si dovrebbe, naturalmente, assicuratevi di avere una chiave primaria, e nel caso del tavolo dates
, potrebbe essere la colonna dt
.
Poi per visualizzare i risultati desiderati:
SELECT
dt,
bID,
sName
FROM
dates
LEFT JOIN table1 ON dt = date AND fld = 'P1'
ORDER BY
dt
Si noti che la selezione dei soli P1
righe è fatto nelle JOIN
criteri. Se si aggiunge una clausola WHERE
a fare lo stesso, perderai tutte le date che non hanno dati.