Thomas: Einen Wertebereich zusammenfassen

Guten Morgen,

ich habe eine Tabelle in der einige Attribute stehen die ich mit einer Abfrage gruppieren und anzeigen lasse.
Felder: hoehe, breite, staerke <-- anzahl

Ich möchte wissen welche hoehe - breite - stärke Kombination am häufigsten vorkommt. Da die breite aber sehr individuelle Eingaben enthält bekomme ich dementsprechend recht viele Datensätze als Ergebniss.
Jetzt würde ich gerne nach einem Wertebereich für die breite gruppieren lassen. Also zb. von 90 - 120 und alles was in diesem Bereich liegt wird zusammengefasst.

Ist das möglich?

Vielen Dank.

Grüße
Thomas

  1. Hi!

    Jetzt würde ich gerne nach einem Wertebereich für die breite gruppieren lassen. Also zb. von 90 - 120 und alles was in diesem Bereich liegt wird zusammengefasst.

    Kannst du den Bereich mit einer Formel ausrechnen, so dass für jeden Bereich ein individueller Wert rauskommt? Beispielsweise kommen bei einer Ganzzahldivision konstante Werte bis zum nächsten Vielfachen des Teilers raus. Ansonsten kannst du mit einem CASE-WHEN-Konstrukt die Werte erzeugen: wenn 0..50 => 0, 50..70 => 1, 70..90 => 2, 90..120 => 3, usw.

    Lo!

    1. Hallo,

      Ansonsten kannst du mit einem CASE-WHEN-Konstrukt die Werte erzeugen: wenn 0..50 => 0, 50..70 => 1, 70..90 => 2, 90..120 => 3, usw.

      Super, danke dafür.
      Hab es jetzt mit einem CASE-WHEN Konstrukt gelöst.
      Soweit klappt das auch, nur kann ich nicht nach dieser erzeugten Alias Spalte gruppieren.

        
      CASE  
      WHEN    CAST(REPLACE(sbreite.wert,'.',',') AS numeric) > 0  
              AND CAST(REPLACE(sbreite.wert,'.',',') AS numeric) <= 100  
          THEN    '0 - 100'  
      WHEN    CAST(REPLACE(sbreite.wert,'.',',') AS numeric) > 100  
              AND CAST(REPLACE(sbreite.wert,'.',',') AS numeric) <= 150  
          THEN    '100 - 150'  
      ELSE  
          '150 - x'  
      END AS breitebereich  
      
      

      Nach "breitebereich" kann ich nun nicht gruppieren. Er scheint diese nicht zu kennen.
      Meldung: "Column (breitebereich) not found in any table in the query"

      Welche Möglichkeiten habe ich?

      Grüße
      Thomas

      1. Hi!

        Soweit klappt das auch, nur kann ich nicht nach dieser erzeugten Alias Spalte gruppieren.

        Ja, denn Gruppieren kommt vor dem Auswerten der SELECT-Klausel. Somit kann nicht nach berechneten Werten der SELECT-Klausel gruppiert werden. Du musst die CASE-WHEN-Formel in die GROUP BY-Klausel schreiben.

        Lo!

        1. Du musst die CASE-WHEN-Formel in die GROUP BY-Klausel schreiben.

          Vielen Dank, so werde ich das jetzt machen. Bläht das ganze halt unnötig auf, da ich den Block jetzt im "Select" und im "Group By" hab.
          Hab grad schon auf ein paar Seiten gelesen das es wohl die einzige Möglichkeit ist.

          Grüße
          Thomas

          1. Du musst die CASE-WHEN-Formel in die GROUP BY-Klausel schreiben.

            Vielen Dank, so werde ich das jetzt machen.

            Habe gerade versucht den CASE Block in die Group By Klausel zu schreiben.
            Das hat mir eine Fehlermeldung geworfen (Syntax Error)

            In meinem Fall greife ich ja auf eine Informix DB zu.
            Jetzt habe ich herausgefunden wie die Gruppierung nach der Spalte im Select möglich ist:

              
            SELECT      SUM( ... ) AS anzahl,  
                        shoehe.wert AS shoehe,  
                        sstaerke.wert AS sstaerke,  
                        CASE  
                        WHEN    CAST(REPLACE(sbreite.wert,'.',',') AS numeric) > 0  
                                AND CAST(REPLACE(sbreite.wert,'.',',') AS numeric) <= 100  
                            THEN    '0 - 100'  
                        WHEN    CAST(REPLACE(sbreite.wert,'.',',') AS numeric) > 100  
                                AND CAST(REPLACE(sbreite.wert,'.',',') AS numeric) <= 150  
                            THEN    '100 - 150'  
                        ELSE  
                            '150 - x'  
                        END AS breitebereich  
            FROM  
            ...  
            GROUP BY    shoehe.wert,  
                        sstaerke.wert,  
                        4  
            
            

            Man spricht die Spalte anhand der Nummer an. In diesem Beispiel ist mein Case Block die 4 Spalte, also spreche ich diese im Group By mit der "4" an.

            Hoffe das hilft vielleicht mal jemanden weiter.

            Grüße
            Thomas

      2. Hallo,

        Hab es jetzt mit einem CASE-WHEN Konstrukt gelöst.

        Nach "breitebereich" kann ich nun nicht gruppieren. Er scheint diese nicht zu kennen.
        Meldung: "Column (breitebereich) not found in any table in the query"

        welches Datenbankmanagementsystem verwendest Du? Welche Version?
        MySQL erlaubt die Verwendung von Spaltenaliasnamen in der GROUP-BY-Klausel.

        Freundliche Grüße

        Vinzenz

        1. welches Datenbankmanagementsystem verwendest Du? Welche Version?
          MySQL erlaubt die Verwendung von Spaltenaliasnamen in der GROUP-BY-Klausel.

          Entschuldigung, hatte ich vergessen zu erwähnen. Es ist eine Informix DB.
          Ich habe mittlerweile schon ein paar Quellen dazu gefunden und gelesen und es ist in meinem Fall wohl nicht erlaubt Aliasnamen in Group By zu verwenden.

          D.h. für mich ich muss den ganzen CASE Block nochmal in meine "Group By" Klausel setzen.

          Danke.

          Grüße
          Thomas