我有这个 -
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
上面的查询给出了多个日期,我尝试按日期分组,但不起作用。
答案 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过滤向上移动到交叉连接中。这将使交叉连接更有效。