Количество отдельных записей — SQL

#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. Извините, здесь немного быстро сработал триггер. Немного неправильно истолковал и перепутал с другим открытым вопросом..