-1

我有这个查询来计算员工一个月内收到的礼物数量。

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'

现在有很多员工在一个日期内被标记为两次或三次出勤。就像一旦员工离开,他的出勤被安排为外出,他来时而不是时间。所以现在算上它是在多次增加同一天的出勤率。我想在日期之间获得不同的日期。

这是示例数据:

2018-04-04 18:12:30  2018-04-04 19:38:12   266  Present
2018-04-04 09:43:01  2018-04-04 09:58:41   266  Present
2018-04-05 16:40:52  2018-04-05 18:40:52   266  Present
2018-04-06 11:35:59  2018-04-06 11:48:49   266  Present

现在它计算日期 4 两次,但它应该计算一次。

4

2 回答 2

3

DISTINCT应该在里面COUNT()

所以,它会是:

SELECT COUNT(DISTINCT [Attendance].[Status]), 
       COUNT(DISTINCT CAST([Attendance].[AttendanceTimeIn] AS Date))
. . .

但是,我建议在子句中使用适当的标准、显式JOIN语法而不是逗号:FROM

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'
于 2018-08-29T18:40:12.550 回答
1

试试这个来投射到日期并执行不同的

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'
于 2018-08-29T18:44:04.210 回答