Announcement

Collapse
No announcement yet.

CASE-Anweisung nach where?

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • CASE-Anweisung nach where?

    Hallo liebe Community,

    ich möchte in einer Daten der letzten drei vollen Monate darstellen. In der Tabelle gibt es auch eine Spalte "MONTH", in der zu den jeweiligen Datensätzen eben die Zahlen 1-12 stehen.

    Weil das aber über den Jahreswechsel Problematisch wird, da ich ja auch noch Daten aus dem vorherigen und gleichzeitig aus dem aktuellen Jahr (z.b. will ich November, Dezember, Januar angezeigt bekommen, wenn ich ich Februar schaue) darstellen muss, hab ich mir gedacht, lös ich das über Case-Klauseln.

    Da ich noch nie Case-Anweisungen gebraucht habe, habe ich mir jetzt mal angeschaut, wie das eigentlich geht. Dabei stellt sich mir zuerst schon die Frage, ob ich Case-Anweisungen auch in der where-Bedingung nutzen kann, und nicht nur in den Select-Anweisungen.

    Ich hatte mir etwas in der Art vorgestellt:
    Code:
    SELECT ...
    FROM ...
    WHERE ...
    AND
    
    CASE to_char(add_months(trunc(sysdate,'MM'),-1),'MM')
    
    WHEN '12'
    THEN "YEAR" = to_char(add_months(trunc(sysdate,'MM'),-1),'YYYY') AND "MONTH" > '9'
    
    WHEN '1'
    THEN ("YEAR" = to_char(add_months(trunc(sysdate,'MM'),-1),'YYYY') AND "MONTH" > '10')
    OR ("YEAR" = to_char(add_months(trunc(sysdate,'MM'),-0),'YYYY') AND "MONTH" = '1')
    
    END
    
    order by ...
    (etc, ein paar Case-Bedingungen fehlen da schon noch, nur als Beispiel)

    Natürlich funktioniert das so nicht.

    Deshalb meine Frage:
    1. Geht das an der Stelle überhaupt?
    2. Wenn ja, was ist an dem Code falsch?

    Viele Grüße,
    Sonnfan

  • #2
    Könnte abhängig von der verwendeten Datenbank sein. Im SQL-Server ist es jedenfalls möglich, du verwendest aber irgendwas anderes (MySQl, Oracle, ..?)

    bye,
    Helmut

    Comment


    • #3
      Ach Mist, hab ich vergessen dazuzusagen, ist Oracle (dürfte aber trotzdem gehen).

      Inzwischen hab ich aber auf englischsprachigen Seiten herausgefunden, dass das anscheinend irgendwie aussehen muss alá

      Code:
      "MONTH" = CASE
      WHEN to_char(add_months(trunc(sysdate,'MM'),-1) = '1' THEN >'10' OR '1'
      WHEN to_char(add_months(trunc(sysdate,'MM'),-1) = '2' THEN >'11' OR '2'
      WHEN (to_char(add_months(trunc(sysdate,'MM'),-1) > '3' AND (to_char(add_months(trunc(sysdate,'MM'),-1) <=12)
      THEN >to_char(add_months(trunc(sysdate,'MM'),-4),'YYYY')

      Da probier ich grad dran rum. Weniger erfolgreich. =/

      Edit:

      Versuchs gared mit
      Code:
      AND "MONTH" = CASE to_char(add_months(trunc(sysdate,'MM'),-1)
      
      WHEN '01' THEN '10' OR '11' OR '12'
      WHEN '02' THEN '11' OR '12' OR '01'
      
      ELSE >(to_char(add_months(trunc(sysdate,'MM'),-1))
      
      END
      ,aber irgendwie scheint dem der to_char(...)-Ausdruck nicht zu passen. =/
      Aber ohne den kann ich das ja net realisieren.
      Zuletzt editiert von Sonnfan; 05.01.2011, 15:25.

      Comment


      • #4
        Ohne Fehlermeldung weiß man ja nicht mal, wo der Fehler genau liegt. Es gibt nur deine Vermutungen.
        Wenn's um das CASE geht, dann probiere doch mal was ohne dem to_char() in der Art
        ... where feld1 = case when '1' = '1' then ... else ...

        bye,
        Helmut

        Comment


        • #5
          Die Fehlermeldung im Orcacle SQL Developer ist immer nur "SQL command not properly ended" in der Zeile mit AND "MONTH" = CASE to_char(add_months(trunc(sysdate,'MM'),-1) und somit nicht sehr hilfreich. =/

          Edit: Hmm, inzwischen hab ich Testweise mit
          Code:
          select Kategorien, Month
          from V_TICKETS_CL_NAGIOS_AVG_MONTH
          where "MONTH" = 
          CASE 
          when '1' = '1' then '11'
          when '1' = '2' then '12'
          END
          sinnvolle Ergebnisse erhalten, nur mit dem to_char geht es nicht...

          Möglich, dass solche Ausdrücke an der Stelle nicht funktionieren...

          EDIT:
          Damit funktioniert es nun:
          Code:
          SELECT ...
          FROM ...
          WHERE "MONTH" = CASE
          
          WHEN to_char(add_months(trunc(sysdate,'MM'),-1),'MM') = '12' THEN '10' -- OR '11' OR '12'
          WHEN to_char(add_months(trunc(sysdate,'MM'),-1),'MM') = '01' THEN '11' -- OR '12' OR '01'
          --ELSE >(to_char(add_months(trunc(sysdate,'MM'),-4),'MM'))
          END
          
          order by KATEGORIEN, Month
          Nun muss ich nur noch das auskommentierte (--) zum funktionieren bringen, weil das geht immernoch nicht. xD
          Die Mehrfachauswahl da z.B.
          Zuletzt editiert von Sonnfan; 05.01.2011, 16:56.

          Comment


          • #6
            Nochmal zurück zu dem Thema: Kann mir jemand die Syntax sagen, mit der ich nach einer Bedingung mehrere mögliche Werte zulassen kann, sprich dass bei der ersten Bedingung im Post drüber z.B. alle Monate mit 10, 11 oder 12 gezeigt werden?

            Comment


            • #7
              So wie du das vorhast geht's nicht. Nach einem THEN kann immer nur ein Wert stehen.
              Mein Vorschlag: nachdem ich was von Monat und 10, 11, oder 12 sehe, willst du wohl etwas quartalsweise auswerten. Dazu berechne lieber das Quartal aus dem Datum anstatt da mit Monaten im Character-Format herumzuspielen.
              Quartal berechnen geht so: man extrahiere das Monat als Integer aus dem Datum, das plus 2 und dann durch 3, also quartal = (monat + 2) / 3.
              Falls Oracle sich nicht anders verhält als der SQL-Server (= Division zweier Integer liefert auch wieder Integer als Ergebnis) sollte das dann mit einem einfachen Vergleich funktionieren, du sparst dir also das CASE.

              bye,
              Helmut

              Comment


              • #8
                Das geht eventuell gerade in die falsche Richtung...
                Welches Problem willst Du denn eigentlich lösen ? So wie ich es bisher verstanden habe, beispielsweise zu Januar 2011 auch die Daten von November und Dezember 2010 anzeigen. Das kann man ggf. mit Funktionen wie LAG erreichen.
                Zum Berechnen des Quartals, falls das eine Rolle spielt, gibt es ebenfalls eine Möglichkeit:
                Code:
                select to_char(sysdate,'Q') quartal from dual;

                Comment


                • #9
                  Richtig, ich will immer die letzten drei Monate.

                  D.h. Im Januar: Oktober, November, Dezember
                  Im Februar: November, Dezember, Januar
                  im März: Dezember, Januar, Februar etc.

                  Das mit dem LAG schau ich mir mal an, was genau das ist. Danke!

                  Comment


                  • #10
                    Hallo,

                    falls es in der Tabelle direkt ein Datum gibt, mit dem verglichen werden kann, würde ich das so machen:
                    [highlight=sql]SELECT * FROM tabelle
                    WHERE to_char(datum_aus_tablle, 'yyyymm') in
                    (to_char(add_months(sysdate,-1),'yyyymm'),
                    to_char(add_months(sysdate,-2),'yyyymm'),
                    to_char(add_months(sysdate,-3),'yyyymm'));
                    [/highlight]

                    Evtl. musst du eben bei dir den Jahres- und Monatswert als VARCHAR2 verketten

                    Gruß

                    Ralf

                    Comment

                    Working...
                    X