DECLARE @ps_StartDate DATETIME = '20190101'
, @ps_EndDate DATETIME = '20191224'
, @ps_COMPANYNO VARCHAR(20) = '01'
SET @ps_EndDate = DATEADD(dd, 1, @ps_EndDate)
SELECT
CASE WHEN @ps_COMPANYNO IN ('01') THEN 'YS45J146'
ELSE 'YS45J147'
END AS 'Client ID'
,e.EMPNO AS 'WORKER ID'
,'' AS 'Org'
,'' AS 'Job Number'
,'Regular' AS 'Pay Component'
,'' AS 'Rate'
,'' AS 'Rate Number'
,SUM(t.TIMEBILLED + (ISNULL(ehrs.AllocationDays, 0) * 24)) AS 'Hours'
,'' AS 'Units'
,'' AS 'Line Date'
,'' AS 'Amount'
,'' AS 'Check Seq Number'
,'' AS 'Override State'
,'' AS 'Override Local'
,'' AS 'Override Local Jurisdiction'
,'' AS 'Labor Assignment'
FROM TIMEBILL t (NOLOCK)
INNER JOIN EMPLOYEE e (NOLOCK) ON t.USERID = e.USERID
LEFT JOIN dbo.EmpHRSchedule ehrs (NOLOCK) ON (e.EmployeeNo = ehrs.EmployeeNo)
WHERE t.PRTID = 'P'
AND t.DATE >= @ps_StartDate
AND t.DATE < @ps_EndDate
AND ehrs.STARTDATE >= @ps_StartDate
AND ehrs.STARTDATE < @ps_EndDate
AND e.COMPANYNO = @ps_COMPANYNO
AND t.SUBCAT <> 'LUNCH'
AND t.WAGETYPE <> 'OVERTIME'
AND e.SALARYUNIT = 'HOURLY'
--AND ehrs.Type = 'HOLIDAY'
GROUP BY e.EMPNO
仅当 dbo.EmpHRSchedule.Type = 'HOLIDAY' 条目存在时,我才尝试将其添加到“小时”列中。据我了解,LEFT JOIN 仅在匹配时才返回条目,对于不匹配则返回 NULL。当我取消注释 AND ehrs.Type = 'HOLIDAY'
行时,根本不返回任何结果。
为什么会出现这样的情况呢?我是否应该采用另一种方法来对 dbo.Timebill.Timebilled 和 dbo.EmpHRSchedule.AllocationDays 进行求和(如果存在)?
最佳答案
当您包括:
AND ehrs.Type = 'HOLIDAY'
在 WHERE
子句中,您实际上得到的是 INNER
连接,而不是 LEFT
连接,因为您只从表中获取匹配的行ers
,而不是 ehrs.Type
为 NULL
的任何不匹配行。
您可以做的是将条件移至 LEFT
连接的 ON
子句:
LEFT JOIN dbo.EmpHRSchedule ehrs (NOLOCK)
ON (e.EmployeeNo = ehrs.EmployeeNo) AND ehrs.Type = 'HOLIDAY'
您还可以在同一个表中包含其他条件:
LEFT JOIN dbo.EmpHRSchedule ehrs (NOLOCK)
ON (e.EmployeeNo = ehrs.EmployeeNo) AND ehrs.Type = 'HOLIDAY'
AND ehrs.STARTDATE >= @ps_StartDate
AND ehrs.STARTDATE < @ps_EndDate
关于sql - 如果添加 WHERE 子句,LEFT JOIN 不返回任何结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59481393/