1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies. Weitere Informationen
  2. Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, Oracle, Sql-Server, Postgres, Access uvm
    Information ausblenden

GROUP BY Integer Bereich

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von Defan, 4 Oktober 2011.

  1. Defan

    Defan Benutzer

    Hi

    ich bräuchte eine Datenbankabfrage, die aus einer tabelle, bei der zum beispiel längen drin stehen, und diese dann nach bestimmten bereichen der längen gruppiert und dann nur die Anzahl der teile in dem bereich ausgibt..

    zum bsp:
    Teil1 10
    Teil2 12
    Teil3 15
    Teil4 18
    Teil5 20
    Teil6 23

    und dann soll
    zw. 0 und 15 -> 3
    zw. 16 und 30 -> 3

    ich hab schon bissl was probiert, aber ich bekomms nich so ganz hin^^

    danke
     
  2. Charly

    Charly Datenbank-Guru

    Hallo Defan,

    versuchs mal hiermit:

    Code:
    select
        case when z2 <= 15 then 'zwischen 0 und 15'
        when z2 > 15 and z2 <= 30 then 'zwischen 16 und 30'
        end as 'Bereich',
        COUNT(z1) as 'Anzahl'
    
    from t1
    
    group by
        case when z2 <= 15 then 'zwischen 0 und 15'
        when z2 > 15 and z2 <= 30 then 'zwischen 16 und 30'
        end
    Gruß Charly
     
    ukulele gefällt das.
  3. Defan

    Defan Benutzer

    Wow danke.. funktioniert wunderbar!!

    nur nochmal zum verständnis:
    "case" ist sowas ähnliches wie switch bei programmiersprechen oder??
    und hat das "end" am ende einen tieferen Sinn?? also was macht das genau??
     
  4. ukulele

    ukulele Datenbank-Guru

  5. Defan

    Defan Benutzer

    achja stimmt.. hab das end im oberen abschnitt total übersehen... gut danke
     
  6. Defan

    Defan Benutzer

    ich hab nochmal ne frage:
    das mit den längen ist jetzt nen blödes beispiel, aber wenn ich jetzt zum bsp diese einteilung nicht nacheinander, sondern leicht überlappend mache, dann schiebt es mir ja die einträge immer in den ersten passenden.
    (also anstatt 0-15,16-20... eben dann 0-15, 10-20, .. oder so)

    gibt es dann die möglichkeit, dass es die einträge, die zw 10 und 15 sind in beide bereiche einordnet?? also doppelt zählt sozusagen??
     
  7. ukulele

    ukulele Datenbank-Guru

    Müsste mit mehreren Spalten gehen, z.B:

    Code:
    SELECT    count(*) AS Anzahl,
            (    CASE
                WHEN    id BETWEEN 0 AND 10        THEN    1
                WHEN    id BETWEEN 11 AND 20    THEN    2
                WHEN    id BETWEEN 21 AND 30    THEN    3
                ELSE    0
                END ) AS [10er Bereich],
            (    CASE
                WHEN    id BETWEEN 0 AND 15        THEN    1
                WHEN    id BETWEEN 16 AND 30    THEN    2
                WHEN    id BETWEEN 31 AND 45    THEN    3
                ELSE    0
                END ) AS [15er Bereich]
    FROM    tabelle
    GROUP BY (    CASE
                WHEN    id BETWEEN 0 AND 10        THEN    1
                WHEN    id BETWEEN 11 AND 20    THEN    2
                WHEN    id BETWEEN 21 AND 30    THEN    3
                ELSE    0
                END ),
            (    CASE
                WHEN    id BETWEEN 0 AND 15        THEN    1
                WHEN    id BETWEEN 16 AND 30    THEN    2
                WHEN    id BETWEEN 31 AND 45    THEN    3
                ELSE    0
                END )
    ORDER BY [10er Bereich],[15er Bereich]
    
    Eventuell kannst dus dir auch mit Division und Runden leichter machen:
    Code:
    SELECT    count(*) AS Anzahl,
            round(id / 10,0) AS [10er Bereich],
            round(id / 15,0) AS [15er Bereich]
    FROM    tabelle
    GROUP BY round(id / 10,0),round(id / 15,0)
    ORDER BY [10er Bereich],[15er Bereich]
     
    Charly gefällt das.
  8. Charly

    Charly Datenbank-Guru

    Und hier noch eine Lösung mit UNION:

    Code:
    select * FROM (
    
        select
            case when z2 >= 0 and z2 <= 15 then 'zwischen 0 und 15' end as 'Bereich',
            count(z1) as 'Anzahl'
            from t1
            Group by case when z2 <= 15 then 'zwischen 0 und 15' end
    
        union all
    
        select
            case when z2 >= 10 and z2 <= 20 then 'zwischen 10 und 20' end as 'Bereich',
            count(z1) as 'Anzahl'
            from t1
            Group by case when z2 >= 10 and z2 <= 20 then 'zwischen 10 und 20' end
        ) AS t2
    
    where Bereich is not NULL
    
    Gruß Charly
     
    ukulele und Walter gefällt das.
  9. Defan

    Defan Benutzer

    hmm also müsste ich für jeden bereich eine eigene select-anweisung machen....

    muss ich mal schaun ob das gut klappt^^
    danke erstmal
     
Die Seite wird geladen...

Diese Seite empfehlen