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
我想要几列,并且仅当员工在同一天有多个约会日期时。
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
不应该在 tableappointment
中,它是多余的。员工应该有一个 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