SQL索引匹配以查找重复数据

SQL索引匹配以查找重复数据,sql,match,Sql,Match,我有下表 Code Name Task aa jones DC ab dave DC aca james IF aca james DC ab trevor IF aa jones IF ag francis DC ag francis IF af derek SF af derek DC 这是一张很大的桌子,上面只是一个简单的例子

我有下表

Code     Name    Task
aa       jones   DC
ab       dave    DC
aca      james   IF
aca      james   DC
ab       trevor  IF
aa       jones   IF
ag       francis DC
ag       francis IF
af       derek   SF
af       derek   DC
这是一张很大的桌子,上面只是一个简单的例子

因此,我想要一些帮助来查找完成
IF
SF
任务和
DC
任务的代码和名称

我希望它能显示出一个人在哪里接触了这两项任务。任务的层次结构是;它以
SF
的形式出现,如果
有人会这样做,然后在后面我们会收到一个
DC
任务,我想要的是由同一个人完成的任务,具有相同的参考号。
我可以在excel中使用索引匹配功能完成这项工作,但由于表的大小,这会占用大量的计算时间。

一种方法是使用
分组方式,使用
具有
。这是表达这些类型条件的灵活方式:

select code, name
from table t
group by code, name
having sum(case when task = 'DC' then 1 else 0 end) > 0 and
       sum(case when task in ('IF', 'SF') then 1 else 0 end) > 0;
having
子句中的每个条件统计满足特定条件的行数。例如,第一种方法计算与
'DC'
匹配的行数,并且只取至少有一个这样匹配的
代码、名称

SELECT code,name FROM YOUR_TABLE_NAME WHERE task = 'DC' AND (task = 'IF' OR task = 'SF') GROUP BY name
请尝试此查询

select code,name from (select distinct code,name from table1 where task='SF' or task='IF') as temp1 inner join (select distinct code as code2,name as name2 from table1 where task='DC') as temp2 on code=code2,name=name2;
我假设您的表位于
表1
中。代码构造了两个表
temp1
temp2
temp1
包含已分配SF和IF的代码和名称
temp2
包含已分配DC的代码和名称。最后,我将这两个表连接在一起,以在这两个表中找到代码名对。这比在Excel中更快,因为数据库引擎可能会临时索引正在连接的列

实际上,您可以在Excel中执行此操作。您可以按代码和名称对表格进行排序,然后输入以下公式(假设“代码”位于
A1
):

选择这两个单元格,然后双击填充控制柄(选择右下角的小正方形)。然后,选择两列,复制,然后“粘贴特殊…”>“值”。然后,对D列和E列中的值均为true的行进行筛选(Alt-D-F-F)。这就是你想要的结果。如果需要,选择这些行并复制到新图纸

或者,您可以遵循Gordon提供的SQL“GroupBy”解决方案,这样您就不需要排序:创建两个类似于上述的新列,但是:

D1: "D"
E1: "E"
D2=if(or(C2="IF",C2="SF"),1,0)
E2=if(C2="DC",1,0)

然后,“插入”>“数据透视表”,拖动“代码”和“名称”作为行标签。将“D”拖到“值”下,单击它,“值字段设置…”,然后选择“最大值”。对“E”执行同样的操作,那么D和E中都有1的行将是您想要的结果。

Gordon Linoff的查询可以简化,前提是
如果
SF
是同义词,并且不能同时出现在同一个代码名对中,正如OP提供的数据所示

SELECT code, name
FROM   table t
GROUP BY code, name
HAVING SUM(CASE WHEN task IN ('IF', 'SF', 'DC') THEN 1 ELSE 0 END) = 2;

名称可以多次执行同一任务?每个任务中只有一个与代码关联。因此,一个代码将有“SF”或“IF”和“DC”可能我不清楚,我的问题是,例如,“james”是否只能执行任务“aca”一次或多次。对不起,任何任务只能执行一次。你能告诉我你在使用哪个数据库并告诉列类型你正在进行逻辑查询错误:
task='DC'和(task='IF'或task='SF')
永远不会计算为
true
。它不依赖于列类型或数据库引擎。您好,我可以问一下。我正在sql中尝试运行它,但它找不到“name2”列,因为表中没有name2列,这是显而易见的。您能解释一下如何克服这个问题吗?除了最后一部分“on name=name2”之外,我理解大部分代码…谢谢您好,谢谢您写这篇非常有用的文章。我使用了Gordon的回复,这是在sql中工作的,并提取了相关数据。然后我使用了一个pivto表对数据进行排序,以便可以对其进行切片。感谢您的回复。很抱歉出现错误。我编辑了代码以更正它。但是,我必须承认Gordon的查询可能是ac实际上比这更有效。知道哪一个执行得更快会很好。嗨,戈登,忽略我之前的帖子。我试过你的代码,效果很好。非常感谢much@Greylegface…您可以将鼠标放在
edit
附近并单击小
x
来删除自己的评论。
SELECT code, name
FROM   table t
GROUP BY code, name
HAVING SUM(CASE WHEN task IN ('IF', 'SF', 'DC') THEN 1 ELSE 0 END) = 2;