【问题标题】:SQL - Select rows where all values in a column are the sameSQL - 选择列中所有值都相同的行
【发布时间】:2015-09-08 23:14:42
【问题描述】:

我一直在努力解决一个 SQL 问题,希望有人能提供帮助。

我有以下数据:

团队 |用户名 |第 1 步 |第 2 步 |第三步 |第 4 步 | STEP5
 001 | 000001 |是 |是 | N | N |是
 001 | 000002 |是 | N | N |是 |是
 002 | 000003 | N |是 |是 | N | ñ
 002 | 000004 | N |是 |是 |是 |是
 003 | 000005 |是 | N | N |是 | ñ
 003 | 000006 |是 |是 |是 | N |是


我需要做的是返回 TEAM 的值,其中任何 STEPx 的所有值都是“N”。

所以在上面的示例中,我需要返回 TEAM 001 和 002因为在 TEAM 001 中,STEP3 的所有值都是“N”,而在 TEAM 002 中,STEP1 的所有值都是“N”。

任何帮助将不胜感激。

【问题讨论】:

  • 你的哪一部分有问题?

标签: sql


【解决方案1】:
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 列,并且每个团队/用户/步骤有一行。这将使您的查询不那么尴尬。

【讨论】:

  • 谢谢!不幸的是,我无权更新这些记录(只是查询访问权限),因此非常感谢您的帮助。
【解决方案2】:

我走了另一条路,但 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

【讨论】:

  • 干杯!感谢您的帮助。
【解决方案3】:

没有纯粹的基于 sql 的解决方案,但每个具体的数据库都可能有自己的方式来遍历所有列。

但是,这种方法很糟糕。 您应该规范化您的数据库。

|TEAM|USER_ID|STEP_ID|VALUE|
|1   | 1     | 1     |  Y  |

之后,可以很容易地用这个表加入团队并用“Y”过滤所有团队

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2014-07-14
    • 1970-01-01
    • 1970-01-01
    • 2015-07-15
    • 2016-06-11
    • 2013-09-20
    相关资源
    最近更新 更多