Группировка, подсчет и исключение на основе значения столбца - PullRequest
0 голосов
/ 10 октября 2011

Хотя я не совсем новичок в SQL или MySQL, я заметил, что есть еще что-то, чему можно научиться. Я не могу разобраться с этим после долгих попыток, чтения и поиска. Если вы можете дать какие-либо указатели, я был бы благодарен.

Я упростил фактические данные и таблицы следующим образом.

Имеются две таблицы: персонал и работа. Они содержат данные о сотрудниках в различных проектах.

Персонал:

ID  Name    Unit     

1   Smith   Chicago
2   Clarke  London
3   Hess    Chicago

Работа:

StaffID   ProjectID

1          10
2          10
3          10
1          20
2          30
3          40
1          50
3          50

Цель:

Чтобы сгруппировать все эти проекты, где есть сотрудники из Чикаго, с учетом всех сотрудников в этом проекте.

Ожидаемый результат:

Project  Staff count

10        3
20        1
40        1
50        2

Таким образом, проект 30 отсутствует в списке, поскольку его участники не из Чикаго.

Мой запрос ниже, очевидно, неверный. Он учитывает только тех участников проекта, которые из Чикаго, а не весь персонал проекта.

SELECT 
    work.projectID as Project, COUNT(*) as "Staff count" 
FROM 
    staff 
JOIN
    work ON staff.ID=work.staffID
WHERE
    unit="Chicago"
GROUP BY
    work.projectID;

Ответы [ 3 ]

3 голосов
/ 10 октября 2011

Удалите пункт where и добавьте пункт имения, который проверяет, что хотя бы один сотрудник находится в Чикаго.

3 голосов
/ 10 октября 2011

Я бы поставил тест на Чикаго в подпункте.
В качестве альтернативы вы можете использовать самосоединение, но я считаю, что подвыбор легче понять.

SELECT 
  w.projectid as project
  ,COUNT(*) as `staff count`
FROM work w
INNER JOIN staff s ON (w.staffID = s.id)
WHERE w.projectID IN (
  SELECT w2.projectID FROM work w2
  INNER JOIN staff s2 ON (w2.staffID = s2.id AND s2.unit = 'Chicago'))
GROUP BY w.projectid
1 голос
/ 12 октября 2011

Наконец: результат. Еще раз спасибо @Johan и @ a'r за вашу помощь, и @Johan за то, что вы выбрали меня на правильный путь (в моем случае).

Я изменил вложенный выбор на производную таблицу и соединил ее с рабочей таблицей по идентификатору проекта.

SELECT 
   w.projectID AS project
   ,COUNT(*) AS `staff count`
FROM work w
INNER JOIN 
    (SELECT DISTINCT w2.projectID 
        FROM work w2
        INNER JOIN staff s ON (w2.staffID = s.id AND s.unit = 'Chicago')) c
ON (w.projectID = c.projectID)
GROUP BY w.projectID
...