编写SQL查询以替换值并包括所有日期

时间:2010-05-19 16:55:27

标签: sql sql-server replace isnull

我有这个 -

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

现在员工表每天都有积分,除非他们没有来......所以日期没有所有的日期条目...我的意思是例如在一周内他没有来2天员工表有只有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

上面的查询给出了多个日期,我尝试按日期分组,但不起作用。

2 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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)。

这也可以捕获没有积分条目的员工。

如果符合您的要求,则可以将between语句和/或EmployeeId过滤向上移动到交叉连接中。这将使交叉连接更有效。