sql脚本仅获取与给定条件匹配的几行

时间:2018-09-05 23:42:02

标签: sql-server join

我有桌子。

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

将空值替换为基于部门的相应人员值。在这种情况下,我们必须将“ Civil”和“ Civil”忽略为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

对于第三季度)。我只需要一行人的评分为空并且他们各自在不同团队中的评分相同的行。由于P2在不同的ece和eee团队中,他们各自的个人评分相同,即 R1

第三季度的输出

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

它不应包含以下行,因为P3在Civil和Mech中都存在,但是人的等级不同即R5和R2

输出不应包括以下这些记录。     id部门人员评分     7民用P3空     10 Mech P3空

2 个答案:

答案 0 :(得分:0)

您可以尝试将COUNT与窗口功能一起使用,通过dept列获取数字,获取cnt > 1数据。

SELECT * 
FROM (
   SELECT *,COUNT(*) OVER (PARTITION BY dept ORDER BY dept) cnt
   FROM T
)t1
where cnt > 1

答案 1 :(得分:0)

第一季度:

您可以使用子查询来查找所有具有多个不重复人员的部门,然后查找该列表中该部门位于的所有记录:

SELECT *
FROM Ihavetable
WHERE dept IN (
  SELECT dept 
  FROM Ihavetable 
  GROUP BY dept
  HAVING COUNT(DISTINCT Person) > 1
  );

第二季度:

要返回所有记录,但对于具有唯一一个不同Person的部门而言,请使用完全相同的唯一Person替换Person列中的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;

第三季度:

此查询将返回至少两个团队中具有零评分的所有人员,并且这些团队中所有具有非零评分的“各自人员”(同事)具有相同的非零评分(此人本身可以是自己的同事,并且在第三支团队中没有零分):

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);