代码之家  ›  专栏  ›  技术社区  ›  Doonie Darkoo

如何在WHERE子句中使用Distinct

  •  -1
  • Doonie Darkoo  · 技术社区  · 6 年前

    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'
    

    现在有很多员工在一次约会中两到三次被标上出勤率。就像一个员工一旦离开,他的出勤率就会被安排为out,而一旦他来了,出勤率就会被安排为timein。因此,现在算起来,它是增加同一天的出席人数多次。我想在两个日期之间找出不同的日期。

    以下是示例数据:

    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,但应该一次计算。

    2 回复  |  直到 6 年前
        1
  •  1
  •   Richard Hubley    6 年前

    试着用这个来铸造日期和执行不同的

    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'
    
        2
  •  3
  •   Yogesh Sharma    6 年前

    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'