Sql server 即使状态为空,也显示所有日期
我有一个查询来显示两个日期之间员工的出勤状态 两个参数@FromDate和@ToDate被传递到存储过程中。此存储过程有一个CTE,其中填写了此期间之间的所有日期。这在下面的查询中由T表示。另一个CTE,即TUI,保存T的所有日期以及来自另一个名为USER_INFO的表的所有相关用户ID 需要联接的其他表包括: 表:用户信息 表:附件详情 表:Att_状态_主机 上面表Att_Status_Master中的Att Status列包含以下值:存在、不存在等 下面代码的问题是,它仅在特定日期存在任何AttStatus时才给出结果。如果没有员工在特定日期标记出勤,则该日期不在结果集中 我希望显示所有日期,而不考虑空值。上面提到的CTE T为临时表结果提供了两个日期之间的所有日期。现在我想为所有员工显示所有这些日期 例如: 如上所述,日期2012年12月1日没有状态,但仍应显示在结果中。而对于下面的查询,它不会显示。下面的查询仅显示AttStatus已填写的记录 最终存储过程代码如下所示:Sql server 即使状态为空,也显示所有日期,sql-server,sql-server-2005,Sql Server,Sql Server 2005,我有一个查询来显示两个日期之间员工的出勤状态 两个参数@FromDate和@ToDate被传递到存储过程中。此存储过程有一个CTE,其中填写了此期间之间的所有日期。这在下面的查询中由T表示。另一个CTE,即TUI,保存T的所有日期以及来自另一个名为USER_INFO的表的所有相关用户ID 需要联接的其他表包括: 表:用户信息 表:附件详情 表:Att_状态_主机 上面表Att_Status_Master中的Att Status列包含以下值:存在、不存在等 下面代码的问题是,它仅在特定日期存在任何
@FromDate DateTime /* Input Parameter */
@ToDate DateTime /* Input Parameter */
If OBJECT_ID('tempdb..#Results',N'U') IS NOT NULL
DROP TABLE #Results
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
@StartDate = Convert(Varchar(25),@FromDate,112)
@EndDate = Convert(Varchar(25), (DateAdd(DAY,15,@FromDate)),112)
;With T (tempStoredDate)
AS (
select @StartDate
union all
select dateadd(day,1,tempStoredDate) from T where T.tempStoredDate < @EndDate
),
TUI AS
(
select T.tempStoredDate, UI.user_id, ui.display_name, dbo.GetEmployeeCode(UI.user_id) AS EmpCode from T
cross join user_info UI
)
select TUI.EmpCode, UI.user_id, UI.Display_Name, TUI.tempStoredDate, AD.dtAttendanceDate, ASM.AttStatus
INTO #Results From TUI
left outer join user_info UI
on TUI.user_id = UI.user_id
left outer join Att_Details AD
on UI.user_id = AD.inUserId
inner join Att_Status_Master ASM
on ASM.inAttendanceStatusId = AD.inAttendanceStatusId
where Convert(Varchar(25),dtAttendanceDate,112) = Convert(Varchar(25),tempStoredDate,112)
group by TUI.tempStoredDate,UI.user_id,UI.Display_Name,TUI.EmpCode,AD.dtAttendanceDate,AD.inAttendanceStatusId,ASM.AttStatus
我注意到,由于WHERE子句,这种情况正在发生。如果忽略WHERE子句,则所有日期都可见,但AttStatus显示错误。是否要将WHERE子句中的条件移到左侧
From TUI
left join user_info UI on TUI.user_id = UI.user_id
left join Att_Details AD on UI.user_id = AD.inUserId
and Convert(Varchar(25),AD.dtAttendanceDate,112)
= Convert(Varchar(25),TUI.tempStoredDate,112) /* condition moved here */
join Att_Status_Master ASM
on ASM.inAttendanceStatusId = AD.inAttendanceStatusId
group by
TUI.tempStoredDate, UI.user_id, UI.Display_Name,
TUI.EmpCode, AD.dtAttendanceDate, AD.inAttendanceStatusId, ASM.AttStatus
你指的是哪一个where子句?你确定它不是Att_Status_Master的内部连接吗?缺少的行的状态为NULL,该状态将不会通过联接criteria@NathanSkerl我也尝试了左连接。@我指的是bonCodigo:where ConvertVarchar25,dtAttendanceDate,112=ConvertVarchar25,tempStoredDate,112Check-它被简化了,但它清楚地显示:使用内部连接,您过滤掉了不存在的数据,使用LEFT OUTER JOIN,您将获得数据……请参见,它仍然只显示存在dtAttendanceDate的员工。不显示所有员工和所有日期。最后一个联接将前面的左联接转换为内部联接,从而消除空行。你是不是想把它放在左连接Att_Details广告和UI.user_id=AD.inUserId之间?
inAttendanceStatusId INT P.K, ATTStatus VARCHAR
@FromDate DateTime /* Input Parameter */
@ToDate DateTime /* Input Parameter */
If OBJECT_ID('tempdb..#Results',N'U') IS NOT NULL
DROP TABLE #Results
DECLARE @StartDate DateTime
DECLARE @EndDate DateTime
@StartDate = Convert(Varchar(25),@FromDate,112)
@EndDate = Convert(Varchar(25), (DateAdd(DAY,15,@FromDate)),112)
;With T (tempStoredDate)
AS (
select @StartDate
union all
select dateadd(day,1,tempStoredDate) from T where T.tempStoredDate < @EndDate
),
TUI AS
(
select T.tempStoredDate, UI.user_id, ui.display_name, dbo.GetEmployeeCode(UI.user_id) AS EmpCode from T
cross join user_info UI
)
select TUI.EmpCode, UI.user_id, UI.Display_Name, TUI.tempStoredDate, AD.dtAttendanceDate, ASM.AttStatus
INTO #Results From TUI
left outer join user_info UI
on TUI.user_id = UI.user_id
left outer join Att_Details AD
on UI.user_id = AD.inUserId
inner join Att_Status_Master ASM
on ASM.inAttendanceStatusId = AD.inAttendanceStatusId
where Convert(Varchar(25),dtAttendanceDate,112) = Convert(Varchar(25),tempStoredDate,112)
group by TUI.tempStoredDate,UI.user_id,UI.Display_Name,TUI.EmpCode,AD.dtAttendanceDate,AD.inAttendanceStatusId,ASM.AttStatus
From TUI
left join user_info UI on TUI.user_id = UI.user_id
left join Att_Details AD on UI.user_id = AD.inUserId
and Convert(Varchar(25),AD.dtAttendanceDate,112)
= Convert(Varchar(25),TUI.tempStoredDate,112) /* condition moved here */
join Att_Status_Master ASM
on ASM.inAttendanceStatusId = AD.inAttendanceStatusId
group by
TUI.tempStoredDate, UI.user_id, UI.Display_Name,
TUI.EmpCode, AD.dtAttendanceDate, AD.inAttendanceStatusId, ASM.AttStatus