Select 行,其中 x 列(共 y 列)符合条件

Select rows where x of y columns meet criteria

使用可能没有完全标准化的 table1,像这样:

ID   S1 S2 S3 S4 S5 S6 S7 S8 S9
101  3  2  1  3  4  3  5  3  3
102  4  3  4  3  2  3  2  3  2
103  3  2  3  4  3  2  3  3  4

(S# 列基本上是分数。)我需要 return 满足两个条件之一的行:

  1. 任何分数都是 1。(这部分很简单,尽管有点乏味。)
  2. 任何三个或更多分数为2。(这部分不是。)

(所以在样本数据中,第1行满足第一个条件,第2行满足第二个条件。第3行也不满足。)

问题是我需要把它硬塞进一个现有的机制中,这意味着没有 SUM(CASE WHEN S1 = '2' OR S2 = '2'... THEN 1 ELSE 0 END),因为没有 没有 aggregation/grouping 发生:这需要成为我可以添加到现有 WHERE 子句的直接条件。

另一个问题是,这是在 SQL Server 2000 上,因此 2008+ 中可用的大多数花哨的添加都不是一个选项。

有什么办法吗?

1 这就是所谓的轻描淡写,伙计们。 :)

一种方法是

WHERE 3 <=
          CASE WHEN S1 = 2 THEN 1 ELSE 0 END +
          CASE WHEN S2 = 2 THEN 1 ELSE 0 END +
          CASE WHEN S3 = 2 THEN 1 ELSE 0 END +
          CASE WHEN S4 = 2 THEN 1 ELSE 0 END +
          CASE WHEN S5 = 2 THEN 1 ELSE 0 END +
          CASE WHEN S6 = 2 THEN 1 ELSE 0 END +
          CASE WHEN S7 = 2 THEN 1 ELSE 0 END +
          CASE WHEN S8 = 2 THEN 1 ELSE 0 END +
          CASE WHEN S9 = 2 THEN 1 ELSE 0 END  

或(未在 SQL Server 2000 上测试)

WHERE  3 <= (SELECT COUNT(*)
             FROM   (SELECT S1
                     UNION ALL
                     SELECT S2
                     UNION ALL
                     SELECT S3
                     UNION ALL
                     SELECT S4
                     UNION ALL
                     SELECT S5
                     UNION ALL
                     SELECT S6
                     UNION ALL
                     SELECT S7
                     UNION ALL
                     SELECT S8
                     UNION ALL
                     SELECT S9)D(S)
             WHERE  S = 2)