2017-02-12 2 views
1

Was ich versuche zu tun, ist eine Tabelle zu erstellen, wo ich zwei Spalten habe, die zweite ist ein Clustering der Variable1, um es nach seinen Werten zu kategorisieren; wenn < 0,1, dann möchte ich "0-10" anzeigen, wenn der Wert zwischen 0,1 und 0,2 liegt, dann "11 - 20" anzeigen, wenn andere, dann "21 - 100" anzeigen. Wenn ich den folgenden Code ausführe, wird "Fehlender Syntaxoperatorfehler" angezeigt.Wie verkette ich IIFs in SQL Access

SELECT Variable2_name, 
     IIF(Variable1_name< 0.1, 
      "0 - 10", 
      IIF(Variable1_name >= 0.1 AND Variable1_name < 0.2, 
       "11 - 20", 
       "21 - 100") 
     ) AS Bucket 
FROM Table 
GROUP BY Variable2_name, 
     IIF(Variable1_name < 0.1, 
      "0 - 10", 
      IIF(Variable1_name < 0.1, 
       "0 - 10", 
       IIF(Variable1_name >= 0.1 AND Variable1_name < 0.2, 
        "11 - 20", 
        "21 - 100") 
      ), 
ORDER BY Variable2_name 

Die Probleme haben in der IIF-Klausel sein, da, wenn ich es funktionierte richtig eine einfache IIF Klausel hatte. Was ist falsch an der Syntax? Wie kann man eine IIF-Klausel innerhalb einer anderen IIF-Klausel verketten und wie muss man diese in die GROUP BY-Klausel aufnehmen?

Vielen Dank!

Vielen Dank

+2

Werfen Sie einen Blick auf Ihre formatierte Abfrage und sagen Sie uns, was das Problem ist. Die 'IIF()' -Rufe, die Sie im 'SELECT'-Look machen, sind legitim, aber die' GROUP BY' sind ein Durcheinander, mit einem verschachtelten 'IIF', der scheinbar nur ein Tippfehler ist. –

Antwort

2

Sie haben einen offensichtlichen Fehler Syntax im Code (zwei iif() s in den select und drei in der group by). Im Allgemeinen ist switch einfacher zu arbeiten als verschachtelte iif() s. Es funktioniert ähnlich wie case in anderen Datenbanken:

SELECT Variable2_name, 
     SWITCH(Variable1_name < 0.1, "0 - 10", 
       Variable1_name < 0.2, "11 - 20", 
       "21 - 100" 
      ) AS Bucket 
FROM Table 
GROUP BY Variable2_name, 
     SWITCH(Variable1_name < 0.1, "0 - 10", 
       Variable1_name < 0.2, "11 - 20", 
       "21 - 100" 
       ) 
ORDER BY Variable2_name; 

Hinweis: Da die Logik es durch die SWITCH() iterativ, die Sie nicht zwei Teile für die zweite Bedingung benötigen. Dies verringert auch die Wahrscheinlichkeit von Fehlern.

Zweitens Sie verwenden keine GROUP BY Funktionen, so dass Sie könnte weiter einfach SELECT DISTINCT mit:

SELECT DISTINCT Variable2_name, 
     SWITCH(Variable1_name < 0.1, "0 - 10", 
       Variable1_name < 0.2, "11 - 20", 
       "21 - 100" 
      ) AS Bucket 
FROM Table 
ORDER BY Variable2_name; 

Und die DISTINCT ist nicht notwendig, wenn Sie wissen, dass die Werte bereits verschieden sind.

1

Im Anschluss an Ihre malformed Cut-and-Paste, können Sie es leicht reduzieren:

SELECT Variable2_name, 
     IIF(Variable1_name < 0.1, 
      "0 - 10", 
      IIF(Variable1_name < 0.2, 
       "11 - 20", 
       "21 - 100") 
     ) AS Bucket 
FROM Table 
GROUP BY Variable2_name, 
     IIF(Variable1_name < 0.1, 
      "0 - 10", 
      IIF(Variable1_name < 0.2, 
       "11 - 20", 
       "21 - 100") 
     ) 
ORDER BY Variable2_name