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'