2016-06-09 3 views
0

mit einer Tabelle arbeiten, die vielleicht nicht sehr normalisiert , etwa so:Wählen Sie Zeilen, in denen x von y Spalten erfüllen Kriterien

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 

(. Die S # Spalten Scores sind, im Grunde) Ich muss Rück Zeilen, in denen eine von zwei Bedingungen erfüllt sind: (. Dieser Teil ist nicht)

  1. Jede Punktzahl ist 1. (. Dieser Teil ist einfach, wenn auch ein bisschen langweilig)
  2. Alle drei oder mehr Noten 2. sind

(Also in den Beispieldaten erfüllt Zeile 1 das erste Kriterium, und Zeile 2 erfüllt das zweite Kriterium. Row 3 nicht entweder treffen)

Das Problem ist, dass ich dies in einen bestehenden Mechanismus Schuhanzieher brauchen, die keine SUM(CASE WHEN S1 = '2' OR S2 = '2'... THEN 1 ELSE 0 END) bedeutet, weil es keine Aggregation/Gruppierung geschieht. Dies muss eine gerade Bedingung sein, dass Ich kann zu einer bestehenden WHERE-Klausel hinzufügen.

Das andere Problem ist, dass dies auf SQL Server 2000 ist, so dass die meisten der fancy-shmancy Ergänzungen, die in 2008 verfügbar sind, sind keine Option.

Gibt es eine Möglichkeit, dies zu tun?

Das ist eine Untertreibung , Leute genannt wird. :)

Antwort

2

Ein Weg

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 

Oder (ungetestet auf 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

Ich versuche, wäre nicht einmal die zweite Option, weil die ersten funktioniert perfekt. Ein bisschen langweilig, um alles zu schreiben, aber ich muss das nur einmal tun. Vielen Dank! – Martha

+0

@Martha und theres mein Punkt gemacht. – Lankymart