SQL 子查询和计数

SQL subquery and count

我想要几列,并且仅当员工在同一天有多个约会日期时。

Appointment table

初始

employeeID employeename appointment_date type
11 James 1/1/2020 office
11 James 1/1/2020 meeting
11 James 1//2020 school
12 Marsha 2/1/2020 office
13 Shane 3/1/2020 school
13 Shane 3/1/2020 office

预计

employeeID employeename appointment_date type Count
11 James 1/1/2020 office 3
11 James 1/1/2020 meeting 3
11 James 1//2020 school 3
13 Shane 3/1/2020 school 2
13 Shane 3/1/2020 office 2

Marsha 被排除在外,因为该日期只有 1 个约会

这是我目前拥有的:

SELECT 
    a.employeeID,
    a.appointment_date,
    a.type,
    (SELECT COUNT(a.employeeID) 
     FROM a.employeeID 
     GROUP BY a.employeeID 
     HAVING COUNT(a.employeeID) > 1)
FROM 
    appointment a
WHERE 
    a.date BETWEEN '1/1/2020' AND '12/31/2020'

您可以使用 count() 的窗口版本。

SELECT x.employeeid,
       x.employeename,
       x.appointment_date,
       x.type,
       x.count
       FROM (SELECT a.employeeid,
                    a.employeename,
                    a.appointment_date,
                    a.type,
                    count(*) OVER (PARTITION BY a.employeeid,
                                                a.appointment_date) count
                    FROM appointment a
                    WHERE a.date >= '2020-01-01'
                          AND a.date < '2021-01-01') x
       WHERE x.count > 1;

备注:

  • employeename 不应该在 table appointment 中,它是多余的。员工应该有一个 table 可以通过 ID 查找名称(和其他详细信息)。
  • 避免将 BETWEEN 用于 date/times。使用一个范围来比较不包括它的末端。这样您就不必担心在精度提高时查询不再获取所有正确的记录。

这是你想要的吗?

   SELECT 
        a.employeeID,
        a.employeeName,
        a.appointment_date,
        a.type,
        T.count
    FROM 
       appointment a
    Left Join (SELECT b.EmployeeID, COUNT(b.employeeID) count 
              FROM appointment b
                 WHERE a.appointment_date >= '2020-01-01'
                 AND b.appointment_date < '2021-01-03'
                 GROUP BY b.employeeID )T on T.EmployeeID=a.EmployeeID
           WHERE 
            T.count>1