2016-04-08 11 views
0

Ich bin auf der Suche nach einer Lösung für bestimmte Abfrage-Problem. Ich habe eine Tabelle Abteilungen und Tabelle Mitarbeiter so entworfen:Verweis auf äußere Tabelle in einer Aggregatfunktion in einer Unterabfrage

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 

Ich möchte Liste aller Abteilungen erhalten, deren Mitarbeiterzahl ist kleiner als die Anzahl der Mitarbeiter in der Verwaltung arbeiten. Das war eine meiner Ideen, aber es hat nicht funktioniert:

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)); 

Antwort

1

Mit GROUP BY und HAVING:

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) 
0

Try this,

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 
     ) 
Verwandte Themen