Sql 如何在WHERE子句中使用Distinct
我有这个查询来计算员工一个月内收到的礼物数量Sql 如何在WHERE子句中使用Distinct,sql,sql-server,Sql,Sql Server,我有这个查询来计算员工一个月内收到的礼物数量 SELECT DISTINCT COUNT([Attendance].[Status]) FROM [HRM].[tbl_EmployeeAttendance] [Attendance], [HRM].[tbl_EmployeeInfo] [Info] WHERE [Attendance].[Status] IN ('Early Left', 'Present', 'Half Day', 'Late In') AN
SELECT DISTINCT
COUNT([Attendance].[Status])
FROM
[HRM].[tbl_EmployeeAttendance] [Attendance], [HRM].[tbl_EmployeeInfo] [Info]
WHERE
[Attendance].[Status] IN ('Early Left', 'Present', 'Half Day', 'Late In')
AND [Info].[ID] = [Attendance].[EmpCode]
AND [Attendance].[EmpCode] = 266
AND CAST([Attendance].[AttendanceTimeIn] AS DATE) >= '2018-08-01'
AND CAST([Attendance].[AttendanceTimeOut] AS DATE) <= '2018-08-15'
现在是两次计数日期4,但它应该一次计数。
DISTINCT
应该在count()中。
因此,它将是:
SELECT COUNT(DISTINCT [Attendance].[Status]),
COUNT(DISTINCT CAST([Attendance].[AttendanceTimeIn] AS Date))
. . .
但是,我建议在FROM
子句中使用适当的标准、明确的JOIN
语法,而不是逗号:
SELECT COUNT(DISTINCT [Attendance].[Status]),
COUNT(DISTINCT CAST([Attendance].[AttendanceTimeIn] AS Date))
FROM [HRM].[tbl_EmployeeAttendance] [Attendance] INNER JOIN
[HRM].[tbl_EmployeeInfo] [Info]
ON [Info].[ID] = [Attendance].[EmpCode]
WHERE [Attendance].[Status] IN ('Early Left', 'Present', 'Half Day', 'Late In') AND
[Attendance].[EmpCode] = 266 AND
CAST([Attendance].[AttendanceTimeIn] AS DATE) >= '2018-08-01'AND
CAST([Attendance].[AttendanceTimeOut] AS DATE) <= '2018-08-15'
选择计数(不同的[出勤][状态],
计数(不同的演员阵容([出席人数][出席人数]截止日期))
来自[HRM].[tbl_员工考勤][考勤]内部加入
[HRM].[tbl_员工信息][信息]
在[信息].[ID]=[出席].[EmpCode]上
其中【出席】【状态】在(‘提前离开’、‘现在’、‘半天’、‘迟到’)和
[出席人数].[EmpCode]=266和
演员阵容([出席人数][出席人数]截止日期)>='2018-08-01'和
强制转换([Attention].[AttendanceTimeOut]作为日期)尝试此操作以强制转换到日期并执行不同的
SELECT COUNT(DISTINCT CAST([Attendance].[AttendanceTimeIn] as Date))
FROM [HRM].[tbl_EmployeeAttendance] [Attendance], [HRM].[tbl_EmployeeInfo] [Info]
WHERE [Attendance].[Status] IN ('Early Left', 'Present', 'Half Day', 'Late In')
AND [Info].[ID] = [Attendance].[EmpCode] AND [Attendance].[EmpCode] = 266
AND CAST([Attendance].[AttendanceTimeIn] AS DATE) >= '2018-08-01'
AND CAST([Attendance].[AttendanceTimeOut] AS DATE) <= '2018-08-15'
选择计数(不同的演员阵容([Attention]。[AttentindaceTimein]作为日期))
来自[HRM].[tbl_EmployeeAttement][Attement],[HRM].[tbl_EmployeeInfo][Info]
其中[出席].[状态]在('提前离开','现在','半天','迟到')
[Info].[ID]=[attention].[EmpCode]和[attention].[EmpCode]=266
和演员([出席人数][出席人数]截止日期)>='2018-08-01'
和CAST([Attention].[AttendanceTimeOut]AS DATE)只有一个状态,我认为他们不需要不同的状态是的,我需要不同的日期是时候开始使用ANSI-92样式的联接了。它们已经存在了25年多了。逗号分隔的表列表非常糟糕,原因有很多。
SELECT COUNT(DISTINCT CAST([Attendance].[AttendanceTimeIn] as Date))
FROM [HRM].[tbl_EmployeeAttendance] [Attendance], [HRM].[tbl_EmployeeInfo] [Info]
WHERE [Attendance].[Status] IN ('Early Left', 'Present', 'Half Day', 'Late In')
AND [Info].[ID] = [Attendance].[EmpCode] AND [Attendance].[EmpCode] = 266
AND CAST([Attendance].[AttendanceTimeIn] AS DATE) >= '2018-08-01'
AND CAST([Attendance].[AttendanceTimeOut] AS DATE) <= '2018-08-15'