SQL-скриптинг для получения только нескольких строк, соответствующих заданному условию - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть стол.

id       dept         Person
1        ece            p1
2        ece            p1
3        ece            null
4        ece            null
6        eee            null
5        eee            p2
6        Civil          P3
7        Civil          P4
8        Civil          null

Замените нулевые значения их соответствующими личными значениями, основанными на отделе. В этом случае мы должны игнорировать Гражданское как Гражданское как 2 человека P3 и P4. Нам нужно заботиться только о тех отделах, в которых есть уникальные личности (ece и eee).

1) Вывод должен быть как

id       dept         Person
1        ece            p1
2        ece            p1
**3        ece            p1
4        ece            p1**
**6        eee            p2**
5        eee            p2
6        Civil          P3
7        Civil          P4

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

2) id отдел Персона

4        Civil          P3
5        Civil          P4

Q3)

id      dept         Person       Rating
1       ece            p1           R1  
2**     ece            p2           Null**     
6       eee            P6           R1             
5**     eee            p2           Null**
6       Civil          P7           Null
7       Civil          P3           Null 
8       Civil          P8           R5
9       Mech           p7           R2
10      Mech           P3           Null

Для Q3). Мне нужны только строки, у которых рейтинги персонажей равны нулю, а соответствующие лица в другой команде, рейтинги одинаковы. Так как P2 в разных командах, eee и eee рейтинги их игроков такие же, как R1

Выход для Q3

id      dept         Person       Rating
2       ece            p2           Null  
5       eee            p2           Null     

Он не должен содержать следующие строки, потому что P3 находится как в гражданском, так и в меховом режимах, но рейтинги персонажа отличаются , то есть R5 и R2

Вывод не должен включать эти записи ниже. ID Dept Персональный Рейтинг 7 Civil P3 Null 10 Mech P3 Null

Ответы [ 2 ]

0 голосов
/ 06 сентября 2018

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);
0 голосов
/ 06 сентября 2018

Вы можете попробовать использовать COUNT с оконной функцией, получить число по столбцу dept и получить данные cnt > 1.

SELECT * 
FROM (
   SELECT *,COUNT(*) OVER (PARTITION BY dept ORDER BY dept) cnt
   FROM T
)t1
where cnt > 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...