3 Stimmen

SQL UPDATE mit CASE, GROUP BY und HAVING

Der SELECT-Befehl unten gibt die richtigen Daten zurück.

SELECT stu.sc, stu.sn, COUNT(*) AS Total,
    CASE
      WHEN COUNT(*) = 3 Then 'Letter 1'
      WHEN COUNT(*) = 4 Then 'Letter 2'
      WHEN COUNT(*) = 5 Then 'Letter 3'
      ELSE 'SARB'
    END AS Letter  
FROM STU  join att ON (stu.SC = att.SC and stu.SN = att.SN)
WHERE att.al in ('c','t','u')
GROUP by stu.sc, stu.sn
HAVING COUNT(*) >= 3

Ich muss ein UPDATE basierend auf dieser Abfrage durchführen und kann einfach nicht herausfinden, wie es funktioniert. Ich habe mir mehrere Online-Beispiele angesehen, die ähnlich sind wie das, was ich brauche, aber ich kriege es einfach nicht zum Laufen. Ich muss in der Lage sein, so etwas zu tun...

UPDATE stu
SET stu.tru = 
   CASE
     When COUNT(*) = 3 Then 'Letter 1'
     When COUNT(*) = 4 Then 'Letter 2'
     When COUNT(*) = 5 Then 'Letter 3'
     ELSE 'SARB'
   END  
FROM stu JOIN att
   on (stu.sc = att.sc and stu.sn = att.sn)
WHERE ATT.AL in ('c','t','u')
GROUP BY stu.sc, stu.sn
HAVING COUNT(*) >= 3

Ich weiß, dass ich Group By und Having nicht direkt in einer Update-Anweisung verwenden kann, aber ich habe Beispiele gesehen, wo sie ein Select mit Group By vor dem Set und Join verwenden. Ich kann es einfach nicht zum Laufen bringen.

Vielen Dank für jede Hilfe.

0 Stimmen

Welche Version von SQL-Server verwenden Sie? 2000? 2005? 2008?

0 Stimmen

Ich sehe deine Antwort unten, aber ich werde dies trotzdem aktualisieren. Ich verwende SQL Server 2008. Danke.

4voto

Michael Fredrickson Punkte 36194
UPDATE stu
SET tru = sub.letter
FROM
    stu JOIN (
    SELECT stu.sc, stu.sn,
        CASE
          WHEN COUNT(*) = 3 THEN 'Buchstabe 1'
          WHEN COUNT(*) = 4 THEN 'Buchstabe 2'
          WHEN COUNT(*) = 5 THEN 'Buchstabe 3'
          ELSE 'SARB'
        END AS Buchstabe  
    FROM STU 
    JOIN att ON (stu.SC = att.SC AND stu.SN = att.SN)
    WHERE att.al in ('c','t','u')
    GROUP by stu.sc, stu.sn
    HAVING COUNT(*) >= 3
) sub ON stu.sc = sub.sc AND stu.sn = sub.sn

0 Stimmen

Ich habe mich entschieden, dies heute Abend zu testen und es funktioniert perfekt. Was ist Ihrer Meinung nach ein "richtigerer" Weg, um dieses Problem zu lösen im Vergleich zu Malks Lösung oben? Ich weiß nicht, wem ich die "Akzeptierte" Antwort geben soll, da beide Lösungen funktionieren. Vielen Dank für die Hilfe.

1 Stimmen

@AnthonyGattuso Ich glaube, sie sind funktional äquivalent; der Unterschied besteht darin, dass es sich um Unterabfragen gegenüber CTEs handelt. CTEs werden normalerweise gegenüber Unterabfragen bevorzugt, sind jedoch in Sql Server 2000 oder früher nicht verfügbar. Ich war mir nicht sicher, welche Version von Sql du verwendest, daher habe ich kein CTE verwendet... aber da du Sql 2008 verwendest, das CTEs unterstützt, würde ich Malks Antwort bevorzugen.

3voto

Malk Punkte 11575
MIT CTE ALS (
  SELECT STU.SC, STU.SN, COUNT(*) AS Gesamt,
      CASE
        WENN COUNT(*) = 3 Dann 'Brief 1'
        WENN COUNT(*) = 4 Dann 'Brief 2'
        WENN COUNT(*) = 5 Dann 'Brief 3'
        SONST 'SARB'
      END ALS Brief  
  VON STU  join ATT AUF (STU.SC = ATT.SC und STU.SN = ATT.SN)
  WO ATT.AL in ('c','t','u')
  GRUPPE nach STU.SC, STU.SN
  HABEN COUNT(*) >= 3
)
AKTUALISIEREN STU
SET STU.TRU = CTE.Brief
VON STU  JOIN CTE
   auf (STU.SC = CTE.SC und STU.SN = CTE.SN)

0 Stimmen

Ich habe beschlossen, das heute Abend zu testen und es funktioniert perfekt. Deiner Meinung nach, gibt es eine "richtigere" Möglichkeit, dies zu erreichen, wenn man diese Lösung mit der von Michael unten vergleicht? Ich weiß nicht, wem ich die "Akzeptierte" Antwort geben soll, da sie beide funktionieren. -- Vielen Dank für die Hilfe.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X