2010-05-19 39 views
2

嗯,我有這個 -寫SQL查詢來替換值,包括所有的日期

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

現在Employee表中有日常點,除非他們沒有來......這樣的日期不都日期條目...我的意思是例如在一個星期內他沒有來兩天Employee表只有5行...所以我有這個dimdate表,其中有所有日期,直到2050年我想加入和爲他沒有積分的日期添加零。所以我寫了這個查詢但是不起作用 -

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 

上面的查詢給出了多個日期,我試着按日期分組但是不起作用。

+0

因此,[日期]是'DimDate'表的主鍵,這個表只有時間(不是日期和時間),對嗎?員工行可以在不同日期有多行? – Thomas 2010-05-19 17:23:39

+0

實際上,dimdate還有其他領域,但我跳過那..但雅日期字段具有唯一值的日期和時間...並沒有員工有重複行的日期..將比較日期時間和日期給出問題? – Vishal 2010-05-19 17:34:38

回答

3

您可能不想加入日期範圍內的兩個表格,而是一個日期。然後過濾由日期範圍設置的記錄。例如

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' 

編輯:

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' 

OR

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' 
+0

雅..我得到了我的prb,但它仍然不會返回我的記錄,直到結束日期...它只返回我在僱員表中的日期..所以它只能返回到'04 - 01-2010'。 。我猜,因爲我加入日期,但不應該離開外部聯接採取所有第一個表日期..? – Vishal 2010-05-19 17:15:54

+0

檢查我上面添加的內容 – 2010-05-19 19:19:34

2

我認爲你需要dimdates表和你的員工定義表之間的交叉連接。這將爲您提供包含所有員工/日期組合的記錄列表。然後,需要將該結果留給外部加入到具有員工積分記錄的表中。

喜歡的東西:

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 

凡EmployeeDefinitionTable是桌子,其唯一列出了所有員工(或者至少它們的ID對這個問題的陳述)。

這也捕捉員工沒有積分條目。

如果語句和/或EmployeeId篩選符合您的要求,則可以將其移動到交叉連接中。這會使交叉連接更有效率。