选择y列x中符合条件的行

时间:2016-06-09 15:13:58

标签: sql-server-2000

使用可能没有严格标准化的表 1 ,如下所示:

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#列基本上是分数。)我需要返回符合以下两个条件之一的行:

  1. 任何得分为1.(这部分很容易,虽然有点乏味。)
  2. 任何三个或更多分数为2.(此部分不是。)
  3. (因此在样本数据中,第1行符合第一个标准,第2行符合第二个标准。第3行也不符合。)

    问题在于我需要将其变为现有机制,这意味着没有SUM(CASE WHEN S1 = '2' OR S2 = '2'... THEN 1 ELSE 0 END),因为没有聚合/分组正在发生:这需要一个直接的条件我可以添加到现有的WHERE子句。

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

    有没有办法做到这一点?

    1 这被称为轻描淡写,伙计们。 :)

1 个答案:

答案 0 :(得分:2)

一种方法是

SELECT 
cust.customer_id, cust.customer_name, p.category,
count(distinct p.department_id) as total_departments,
count(*) as total_purchases
FROM customers cust 
LEFT JOIN purchase_table p on (cust.customer_id = p.customer_id)
GROUP BY cust.customer_id, cust.customer_name, p.category
ORDER BY cust.customer_id;

或(在SQL Server 2000上未经测试)

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