#sql #db2
#sql #db2
Вопрос:
empid projectId TaskID
100 500 1
100 501 1
100 502 1
101 500 2
101 500 5
101 500 1
102 400 1
103 300 2
104 300 2
105 300 2
Я пытаюсь перечислить сотрудников, которые работают только над несколькими проектами, на основе идентификатора проекта.
Я пробовал различать и ГРУППИРОВАТЬ ПО. но я не могу понять это точно.
из приведенной выше таблицы я ожидаю такого результата
empid projectId
100 500
100 501
100 502
Ответ №1:
Попробуйте это (пересмотренный код)
SELECT DISTINCT EmpId, ProjectId
FROM TableX
WHERE EmpId IN
(
SELECT EmpId
FROM TableX
GROUP BY EmpId
HAVING COUNT (DISTINCT ProjectId) > 1
)
Это должно дать вам
EmpId ProjectId
----------- -----------
100 500
100 501
100 502
3 row(s)
Редактировать содержимое, добавленное для дополнительного вопроса OPs в комментариях
Количество, дающее вам distint ProjectIds, будет означать, что GROUP BY будет на EmpId
уровне и нет необходимости в подзапросе
SELECT EmpId, Count (Distinct ProjectId) Projects
FROM TableX
GROUP BY EmpId
Чтобы получить количество проектов для всех сотрудников с несколькими проектами, выполните следующие действия
SELECT EmpId, Count (Distinct ProjectId) Projects
FROM TableX
GROUP BY EmpId
Having Count (Distinct ProjectId) > 1
Комментарии:
1. Вам нужен
COUNT
список задач?
Ответ №2:
Вы также можете использовать оконный COUNT()
:
WITH counted AS (
SELECT
empid,
projectId,
COUNT(DISTINCT projectId) OVER (PARTITION BY empid) AS ProjectCount
FROM atable
)
SELECT DISTINCT
empid,
projectId
FROM counted
WHERE ProjectCount > 1
Ссылки:
Ответ №3:
SELECT y.empid, y.projectId
FROM (SELECT empid
FROM YourTable
GROUP BY empid
HAVING COUNT(*) > 1) t
INNER JOIN YourTable y
ON t.empid = y.empid
ORDER BY y.empid, y.projectId
Комментарии:
1. В этом случае вам действительно не нужно объединяться.
2. @MariusSolbakkenMellum Можете ли вы показать нам, как вы делаете это без объединения?
3. Извините, здесь немного быстро сработал триггер. Немного неправильно истолковал и перепутал с другим открытым вопросом..