2016-06-09 104 views
0

有一個表,也許不是非常標準化,像這樣的工作中選擇行:其中y列的X滿足標準

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。

(所以在樣本數據中,第1行符合第一條準則,第2行符合第二條準則。第3行沒有任何滿足)

的問題是,我需要硬塞到現有的機制,這意味着沒有SUM(CASE WHEN S1 = '2' OR S2 = '2'... THEN 1 ELSE 0 END)這一點,因爲有沒有聚集/分組發生:這需要一個直條件我可以添加到現有的WHERE子句中。

另一個問題是,這是在SQL Server 2000,所以大多數在2008+可用的花式噓聲增加不是一個選項。

有沒有辦法做到這一點?

這就是所謂的輕描淡寫,鄉親們。 :)

回答

2

一種方法是

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) 
+0

我甚至沒有嘗試第二個方案,因爲第一部作品完美。有點繁瑣寫出來,但我只需要做一次。謝謝! – Martha

+0

@Martha和我的觀點。 – Lankymart

相關問題