SQL - 选择列中所有值相同的行

时间:2015-09-08 23:14:42

标签: sql

我有一个我一直在努力的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'。

非常感谢任何帮助。

3 个答案:

答案 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"过滤所有团队。