SQL Server 从sql中的列中选择特定值

ej83mcc0  于 2023-01-04  发布在  其他
关注(0)|答案(4)|浏览(264)

我的原始数据集看起来与下面提到的示例数据集非常相似:
| 身份证|姓名|乡村|系|
| - ------|- ------|- ------|- ------|
| 1个|罗恩|美国|人力资源|
| 第二章|约翰|美国|人力资源|
| 第二章|约翰|美国|信息技术|
| 第二章|约翰|美国|信息技术|
| 三个|凯利|美国|信息技术|
| 三个|凯利|美国|信息技术|
| 四个|戴夫|美国|销售额|
| 四个|戴夫|美国|信息技术|
| 四个|戴夫|美国|信息技术|
| 四个|戴夫|美国|市场营销|
| 五个|诺拉|美国|信息技术|
我想显示那些只在IT部门工作过的雇员的姓名。例如,John在HR和IT部门都工作过,所以我想从输出中排除他的姓名。在SQL Server中应该采用什么方法?
基于上面的例子,我的输出应该类似于下表:
| 身份证|姓名|乡村|系|
| - ------|- ------|- ------|- ------|
| 三个|凯利|美国|信息技术|
| 三个|凯利|美国|信息技术|
| 五个|诺拉|美国|信息技术|

6bc51xsx

6bc51xsx1#

有几种方法,一种是使用not exists

select * 
from t
where department = 'it' 
and not exists (select * from t t2 where t2.id = t.id and t2.department != 'it');

另一种方法是使用聚合窗口函数:

select id, name, country, department from (
    select *, 
      Min(department) over(partition by id) mind, 
      Max(department) over(partition by id) maxd
    from t
)t
where mind = maxd and maxd = 'it';
w6mmgewl

w6mmgewl2#

您可以使用group by对相同名称进行分组,并将每个部门行与minmax进行比较,以检查它是否只有一个部门,如下所示。

select name, min(department) department
from   t
group by name
having min(department) = max(department)

您可以通过添加另一个条件(min用于部门,因为它在having语句中)来过滤IT部门,如下所示。

select name, min(department) department
from   t
group by name
having min(department) = max(department)
and min(department) = 'IT'

并且可以通过在子查询中使用它来获取所有未分组的行,如下所示。

select *
from   t
where  name in
(
    select name
    from   t
    group by name
    having min(department) = max(department)
    and min(department) = 'IT'
)

演示:https://dbfiddle.uk/?rdbms=sqlserver_2019&fiddle=add8a5278770cf889a0e898fce6ad9a7

2g32fytz

2g32fytz3#

试试这个:

SELECT id, name, country, department 
FROM test
WHERE department='IT' AND name NOT IN (SELECT name FROM test WHERE 
department<>'IT')
ORDER BY id asc;

根据您的需要工作,在MySQL和SQL Server中测试。

cx6n0qe3

cx6n0qe34#

你可以选择条件分组。

;with cte_EmployeeCounts AS
(
SELECT id, count(*) as Total_Dept, count(case when department = 'IT' THEN 1 END) as Total_IT_Dept
FROM TableName
GROUP BY id
)
SELECT * FROM TableName
where id in  (SELECT id from cte_EmployeeCounts WHERE Total_Dept = Total_IT_Dept)

相关问题