Domanda

Beh io ho questo -

Table DimDate- Date 
Table Employee-  Id,Name,Points,Date

Ora la tabella Employee ha punti per tutti i giorni, a meno che non è venuto ... per cui la data non ha tutte le voci date ... Voglio dire per esempio in una settimana non è venuto per 2 giorni la tabella dipendente ha solo 5 righe ... quindi non ho questa tabella DimDate che ha tutte le date fino al 2050 che voglio unire con e aggiungere zeri per le date non ha punti. Così ho scritto questa domanda ma non funziona -

Select E.EmployeeId,D.Date,isNull(E.Points,0) from DimDate D left join Employee E on D.Date between '01-01-2009'and '06-01-2009' where E.EmployeeId=1

È possibile che questo interrogazione give più date e ho cercato di gruppo per il data ma non funziona.

È stato utile?

Soluzione

Probabilmente non vuoi unire le due tabelle in un intervallo di date, ma una data. Poi filtrare il record stabilito da l'intervallo di date. Esempio

Select 
  E.EmployeeId,
  D.Date,
  isNull(E.Points,0)  
from DimDate D 
left join Employee E on D.Date = E.Date 
where E.EmployeeId=1 
  AND D.Date Between '01-01-2009'and '06-01-2009'

A cura:

Select 
  E.EmployeeId,
  D.Date,
  isNull(E.Points,0)  
from DimDate D 
left join Employee E on D.Date = E.Date And E.EmployeeId=1
where D.Date Between '01-01-2009'and '06-01-2009'

o

Select 
  E.EmployeeId,
  D.Date,
  isNull(E.Points,0)  
from DimDate D 
left join Employee E on D.Date = E.Date 
where (E.EmployeeId = 1 OR E.EmployeeId is NULL) 
  AND D.Date Between '01-01-2009'and '06-01-2009'

Altri suggerimenti

Credo che avete bisogno di un cross join tra la tabella dimdates e la tabella in cui sono definiti i dipendenti. Questo vi darà un elenco di record con tutte le combinazioni dipendente / data. Poi il risultato di che ha bisogno di essere lasciato esterno unito al tavolo che ha il record di punti dei dipendenti.

Qualcosa di simile:

Select CJ.EmployeeId,CJ.Date,isNull(E.Points,0) 
    from (SELECT EmployeeID, D.Date
          from DimDate D CROSS JOIN [EmployeeDefinitionTable] as edt) as CJ
        left outer join Employee E on CJ.Date =E.Date AND CJ.EmployeeId = E.EmployeeId
where CJ.Date between '01-01-2009'and '06-01-2009'
  and E.EmployeeId = 1

Dove EmployeeDefinitionTable è una tabella che elenca in modo univoco tutti i dipendenti (o almeno la loro identificazione è per questa dichiarazione problema).

Questa cattura anche i dipendenti senza punti voci.

L'tra la dichiarazione e / o il filtraggio EmployeeId potrebbe essere spostato in alto nei cross join se si adatta alle vostre esigenze. Renderebbe i cross join più efficiente.

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