SQL Server视图添加WHERE子句:仅统计当年休假时长并保留员工记录
如何让视图仅计算当前年份的休假时长并保留所有员工记录
你遇到的问题很典型——直接在WHERE子句里加年份过滤会破坏左连接的效果,因为那些当年没有提交休假申请的员工,YearRequested字段是NULL,会被WHERE条件直接过滤掉,就看不到这些员工的记录了。
正确的做法是把年份过滤条件放到LEFT JOIN的ON子句里,这样只会匹配当前年份的休假记录,同时保留所有员工的行:
ALTER VIEW [dbo].[vw_HoursTakenPerEmployee] AS SELECT e.[EmployeeID], COALESCE(SUM(hrf.[HoursTaken]), 0) AS HoursTaken FROM [dbo].[Employee] e LEFT JOIN [dbo].[HolidayRequestForm] hrf ON e.[EmployeeID] = hrf.[EmployeeID] AND hrf.YearRequested = YEAR(GETDATE()) -- 把年份条件放到这里! GROUP BY e.[EmployeeID]; GO
为什么这么做?
- 当条件放在JOIN的
ON子句时,SQL只会在关联两张表的时候筛选出当前年份的休假记录,没有匹配到的员工行依然会保留,只是hrf相关的字段为NULL。 - 再通过
COALESCE(SUM(hrf.[HoursTaken]), 0),把NULL的求和结果转换成0,完美满足“保留所有员工+仅统计当前年份时长”的需求。
修改后的查询结果(以2019年为例):
| EmployeeID | HoursTaken |
|---|---|
| 1 | 16 |
| 2 | 8 |
| 3 | 0 |
内容的提问来源于stack exchange,提问作者Conor8630
相关产品推荐
相关产品推荐

