Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Selezionando tutte le date da una tabella all'interno di un intervallo di date e includendo 1 riga per data vuota

Esistono diversi modi per gestire le righe mancanti, ma tutti riguardano l'avere un altro set di dati da combinare con i risultati correnti.

Ciò potrebbe essere derivato dai tuoi risultati, creato da un CTE o da un altro processo (come il tuo esempio) o (la mia preferenza) utilizzando un modello permanente contro cui unirsi.

Il modello nel tuo caso potrebbe essere solo una tabella di date, come il tuo @datesTBL. La differenza è che viene creato in anticipo con, ad esempio, 100 anni di date.

La tua query potrebbe quindi essere simile al tuo esempio, ma proverei quanto segue...

SELECT 
    dt.tempDate ,
    InstructorID,           EventStart, 
    EventEnd,               cancelled, 
    cancelledInstructor, 
    EventType,              DevName, 
    Room,                   SimLocation, 
    ClassLocation,          Event, 
    Duration,               TrainingDesc, 
    Crew,                   Notes, 
    LastAmended,            InstLastAmended, 
    ChangeAcknowledged,     Type, 
    OtherType,              OtherTypeDesc, 
    CourseType 
FROM 
  @datesTBL dt 
LEFT OUTER JOIN
  OpsInstructorEventsView iv
    ON  iv.EventStart >= dt.tempDate
    AND iv.EventStart <  dt.tempDate + 1
    AND iv.InstructorID = @InstructorID 
WHERE
      dt.tempDate >= @StartDate
  AND dt.tempDate <= @EndDate
ORDER BY
  dt.tempDate,
  iv.EventStart

Questo inserisce il modello di calendario a SINISTRA, e quindi semplifica molte query poiché sai che il campo della data del calendario è sempre compilato, è sempre un valore di sola data (nessuna parte temporale), è in ordine, è semplice da GROUP BY, ecc.