GROUP BY Integer Bereich

Defan

Benutzer
Beiträge
7
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
 
Werbung:

Charly

Datenbank-Guru
Beiträge
306
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
 

Defan

Benutzer
Beiträge
7
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??
 

Defan

Benutzer
Beiträge
7
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??
 

ukulele

Datenbank-Guru
Beiträge
4.582
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

Datenbank-Guru
Beiträge
306
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
 
Werbung:

Defan

Benutzer
Beiträge
7
hmm also müsste ich für jeden bereich eine eigene select-anweisung machen....

muss ich mal schaun ob das gut klappt^^
danke erstmal
 
Oben