Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 即使状态为空,也显示所有日期_Sql Server_Sql Server 2005 - Fatal编程技术网

Sql server 即使状态为空,也显示所有日期

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和@ToDate被传递到存储过程中。此存储过程有一个CTE,其中填写了此期间之间的所有日期。这在下面的查询中由T表示。另一个CTE,即TUI,保存T的所有日期以及来自另一个名为USER_INFO的表的所有相关用户ID

需要联接的其他表包括:

表:用户信息

表:附件详情

表:Att_状态_主机

上面表Att_Status_Master中的Att Status列包含以下值:存在、不存在等

下面代码的问题是,它仅在特定日期存在任何AttStatus时才给出结果。如果没有员工在特定日期标记出勤,则该日期不在结果集中

我希望显示所有日期,而不考虑空值。上面提到的CTE T为临时表结果提供了两个日期之间的所有日期。现在我想为所有员工显示所有这些日期

例如:

如上所述,日期2012年12月1日没有状态,但仍应显示在结果中。而对于下面的查询,它不会显示。下面的查询仅显示AttStatus已填写的记录

最终存储过程代码如下所示:

@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