1:
Вы можете использовать подзапрос, который находит все хранилища с более чем одним отдельным человеком, а затем находит все записи, где находится отдел в этом списке:
SELECT *
FROM Ihavetable
WHERE dept IN (
SELECT dept
FROM Ihavetable
GROUP BY dept
HAVING COUNT(DISTINCT Person) > 1
);
Q2:
Чтобы вернуть все записи, кроме точек с одним и тем же человеком, замените значения NULL в столбце «Человек» на точно такого человека, вы можете использовать что-то вроде этого:
WITH
calculation (dept, num, pMax) AS (
SELECT dept, COUNT(DISTINCT Person), MAX(Person)
FROM Ihavetable
GROUP BY dept
)
SELECT t.id, t.dept,
CASE c.num
WHEN 1 THEN ISNULL(t.Person, c.pMax)
ELSE t.person
END AS Person
FROM Ihavetable t
LEFT JOIN calculation c ON t.dept = c.dept
Если вы не хотите видеть значения NULL, которые нельзя заменить, добавьте в конце это предложение WHERE:
WHERE c.num = 1 OR t.Person IS NOT NULL;
Q3:
Этот запрос вернет всех лиц, которые имеют нулевой рейтинг, по крайней мере, в 2 командах, и где все его «соответствующие лица» (коллеги) в этих командах, которые имеют ненулевой рейтинг, имеют одинаковый ненулевой рейтинг. (где само лицо может быть его собственным коллегой, имеющим ненулевой рейтинг в третьей команде):
WITH
calculation AS (
SELECT t1.Person
FROM Ihavetable t1
INNER JOIN Ihavetable t2 ON t1.dept = t2.dept
WHERE t1.Rating IS NULL
GROUP BY t1.Person
HAVING COUNT(DISTINCT t2.Rating) = 1
AND COUNT(DISTINCT t2.dept) >= 2
)
SELECT id, dept, Person, Rating
FROM Ihavetable
WHERE Rating IS NULL
AND Person IN (SELECT Person FROM calculation);