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。(这部分很简单,尽管有点乏味。)
- 任何三个或更多分数为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)
使用可能没有完全标准化的 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。(这部分很简单,尽管有点乏味。)
- 任何三个或更多分数为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)