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 ..

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top