2015-02-16 3 views
0
.

. Я пытаюсь создать некоторый SQL, который будет подсчитывать количество сотрудников в каждой компании и возвращать только те компании, у которых больше или равно n сотрудников.SQL Server. Для каждой отдельной компании подсчитывается количество сотрудников.

У меня есть следующие таблицы (упрощенный):

CompanyEmployee Table 

ID Name   IsCompany 
1  John Joe  0 
2  Company Y 1 
3  Company X 1 
4  Sally Jeff 0 
5  James Peach 0 

Employment Table 
ID EmployeeID CompanyID 
1  1    2 
2  4    3 
3  5    3 

Мой желаемый результат для n=2:

ID Name   IsCompany 
3  Company X 1 

У меня есть следующий SQL:

SELECT t.* FROM CompanyEmployee AS t 
WHERE t.ID IN ( 
    SELECT DISTINCT (t.ID) 
    FROM CompanyEmployee AS t 
    INNER JOIN Employment AS t0 ON t.ID = t0.CompanyID 
    WHERE t.IsCompany = 1 
    GROUP BY t0.CompanyID 
    HAVING COUNT(t0.EmployeeID) >= n) 

Но он генерирует следующее сообщение об ошибке:

Column 'CompanyEmployee.ID' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

Любая помощь или совет будет весьма признателен!

+0

Что значит «не работает» означает? –

+0

Я обновил вопрос, включив в него ошибку. – ThreadedLemon

ответ

3

смесительные компании и сотрудников таким образом, это плохая идея. Использование прямого внутреннего соединения может работать до тех пор, пока значения id между двумя разными типами строк никогда не пересекаются. Я думаю, если это столбец идентичности, то это не должно произойти.

with Companies as (
    select ID as CompanyID, Name 
    from CompanyEmployee 
    where IsCompany = 1 
), Employees as (
    select CompanyID, Name 
    from CompanyEmployee where 
    IsCompany = 0 
) 
select c.CompanyID, Name, 1 as IsCompany 
from 
    Companies as c 
    inner join Employment as ec on ec.CompanyID = c.CompanyID 
    inner join Employees as e on e.EmployeeID = ce.EmployeeID 
group by 
    c.CompanyID 
having count(*) >= n 

Существует еще простой способ сделать это:

select * 
from CompanyEmployee 
where ID in (
    select CompanyID 
    from Employment 
    group by CompanyID 
    having count(*) >= n) 
) 
+1

Согласитесь с первым предложением, однако я действительно ненавижу использовать предложение IN из-за его «производительности»;) Upvoted! –

+0

Я был бы готов поспорить, что планы запросов очень похожи. Оптимизатор хорош в преобразовании подзапросов таким образом. – shawnt00

+0

@Maciej Я думаю, вы можете думать о проблеме в древних версиях SQL Server. В современных версиях 'IN' обычно оптимизируется точно так же, как' EXISTS'. –

2

Попробуйте это:

SELECT t1.CompanyId, t2.CompanyName, COUNT(t1.CompanyId) 
FROM Employment AS t1 INNER JOIN CompanyEmployee AS t2 ON t1.CompanyId = t2.Id 
GROUP BY t1.CompanyId, t2.CompanyName 
HAVING COUNT(t1.CompanyId)>=n 

где п является ряд сотрудников ...

+0

'Неверный синтаксис рядом с ключевым словом 'GROUP'.' – ThreadedLemon

+0

Обновлено ... Извините, я написал это прямо из головы;) –

+0

Спасибо! Это работало отлично, однако shawnt00 обеспечил более простое решение. – ThreadedLemon

Смежные вопросы