我有一个我一直在努力的SQL问题,希望有人可以提供帮助。
我有以下数据:
TEAM | USERID | STEP1 | STEP2 | STEP3 | STEP4 | STEP5 001 | 000001 | Y | Y | N | N | Y 001 | 000002 | Y | N | N | Y | Y 002 | 000003 | N | Y | Y | N | N 002 | 000004 | N | Y | Y | Y | Y 003 | 000005 | Y | N | N | Y | N 003 | 000006 | Y | Y | Y | N | Y
我需要做的是返回TEAM的值,其中任何STEPx的所有值都是'N'。
所以在上面的例子中我需要TEAM 001和002要返回,因为在TEAM 001中,STEP3的所有值都是'N',而在TEAM 002中,STEP1的所有值都是'N'。
非常感谢任何帮助。
答案 0 :(得分:6)
select team
from table
group by team
having
sum(case step1 when 'N' then 0 else 1 end) = 0
or sum(case step2 when 'N' then 0 else 1 end) = 0
or sum(case step3 when 'N' then 0 else 1 end) = 0
or sum(case step4 when 'N' then 0 else 1 end) = 0
or sum(case step5 when 'N' then 0 else 1 end) = 0
这是一个小提琴:http://sqlfiddle.com/#!6/ecbff/3
最好规范化数据,以便拥有一个名为STEP
的int列,每个团队/用户/步骤一行。这会让您的查询更加尴尬。
答案 1 :(得分:1)
我走了另一条路,但Blorgbeard比我快得多。
select TEAM
from TEAMS
group by TEAM
having
count(case STEP1 when 'Y' then 1 end) = 0
or count(case STEP2 when 'Y' then 1 end) = 0
or count(case STEP3 when 'Y' then 1 end) = 0
or count(case STEP4 when 'Y' then 1 end) = 0
or count(case STEP5 when 'Y' then 1 end) = 0
答案 2 :(得分:0)
没有基于sql的纯解决方案,但每个conrete数据库可能有自己的方式迭代所有列。
然而,这种做法很糟糕。 您应该规范化数据库。
|TEAM|USER_ID|STEP_ID|VALUE|
|1 | 1 | 1 | Y |
在此之后,很容易将这个表加入团队,并使用" Y"过滤所有团队。