在子查询的聚合函数中引用外部 table

Referencing outer table in an aggregate function in a subquery

我正在寻找特定查询问题的解决方案。我有一个 table 个部门和 table 个员工,设计如下:

Departments                      Employees
=====================            ============================
ID | Name                        ID | Name | Surname | DeptID
---------------------            ----------------------------
1  | ADMINISTRATION              1  | X    | Y       | 2
2  | IT                          2  | Z    | Z       | 1
3  | ADVERTISEMENT               3  | O    | O       | 1
                                 4  | A    | B       | 3

我想获取员工人数少于管理部门员工人数的所有部门的列表。 那是我的想法之一,但没有奏效:

select * from Departments as Depts where Depts.ID in
(select Employees.ID from Employees group by Employees.ID
 having count(Employees.ID) < count(case when Depts.Name='ADMINISTRATION' then 1 end));

使用 GROUP BYHAVING:

SELECT
    d.ID, d.Name
FROM Departments d
LEFT JOIN Employees e
    ON e.DeptID = d.ID
GROUP BY d.ID, d.Name
HAVING
    COUNT(e.ID) < (SELECT COUNT(*) FROM Employees WHERE DeptID = 1)

试试这个,

declare @Departments table (ID int, Name varchar(50))                      
insert into @Departments          
values           
(1 ,'ADMINISTRATION')             
,(2 ,'IT')              
,(3 ,'ADVERTISEMENT')   


declare @Employees table (ID int, Name varchar(50)
,Surname varchar(50),DeptID int)          
insert into @Employees
values
(1 ,'X','Y',2)
,(2 ,'Z','Z',1)
,(3 ,'O','O',1)
,(4 ,'A','B',3)      


;

WITH CTE
AS (
    SELECT *
        ,row_number() OVER (
            PARTITION BY deptid ORDER BY id
            ) rn
    FROM @Employees
    WHERE deptid <> 1
    )
SELECT *
FROM cte
WHERE rn < (
        SELECT count(id) admincount
        FROM @Employees
        WHERE DeptID = 1
        )