我有下表
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
或IF
的形式出现,然后有人会这样做,然后在我们收到DC
任务的背后,我希望它们已经完成了同一个人,具有相同的参考编号。
我可以使用INDEX MATCH函数在excel中执行此操作,但由于表的大小,这会占用大量的计算时间。
答案 0 :(得分:2)
解决此问题的一种方法是将group by
与having
一起使用。这是表达这些类型条件的灵活方式:
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'
匹配的行,并仅采用至少有一个此类匹配的code, name
对。
答案 1 :(得分:0)
SELECT code,name FROM YOUR_TABLE_NAME WHERE task = 'DC' AND (task = 'IF' OR task = 'SF') GROUP BY name
尝试此查询
答案 2 :(得分:0)
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;
我假设您拥有table1
中的表格。该代码构造了两个表temp1
和temp2
。 temp1
包含已分配SF和IF的代码和名称。 temp2
包含已分配DC的代码和名称。最后,我将两个表连接在一起,在两个表中查找代码名对。这比在Excel中更快,因为数据库引擎可能会临时索引要连接的列。
实际上,您可以在Excel中执行此操作。您按代码和名称对表进行排序,然后输入以下公式(假设"代码"在A1
中):
D2=if(and(A2=A1,B2=B1,D1),true,or(C2="IF",C2="SF"))
E2=if(and(A2=A1,B2=B1,E1),true,C2="DC")
选择这两个单元格,然后双击填充柄(选区右下角的小方块)。然后,选择两列,复制,然后"选择粘贴..." > "值&#34 ;.然后,对列D和E中的值都为真的行进行过滤(Alt-D-F-F)。这就是你想要的结果。如果需要,请选择这些行并复制到新工作表。
或者,您可以按照"来跟踪SQL"组。由Gordon提供的解决方案,这样您就不需要排序:创建两个新列,如上所述,但是:
D1: "D"
E1: "E"
D2=if(or(C2="IF",C2="SF"),1,0)
E2=if(C2="DC",1,0)
然后,"插入" > "数据透视表",拖动"代码"和"姓名"是行标签。拖动" D"要在值下,单击它,"值字段设置...",然后选择" Max"。对" E"执行相同的操作,然后D和E中的1行将是您想要的结果。
答案 3 :(得分:0)
在IF
和SF
是同义词的假设下,Gordon Linoff的查询可以变得更容易,并且不能同时存在于相同的Code-Name对,因为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;