Klassen bilden bei Abfragen

Hallo,

beschäftige mich zur Zeit mit einer Datenbank, in der u.a. PLZ und Gewichte von Warensendungen stehen. Beides würde ich gerne auch in Klassen einteilen.

Das habe ich bei der PLZ auch geschafft in dem ich da eine Abfrage ähnlich wie die hier mache:
select runden(Plz / 10000) as plz_klasse from versanddaten.
Ich weiß runden gibt es nicht, aber bei Access heißt die Funktion int() im SQL Standard heißt es trunc() (glaub ich mal…)
Das liefert mir immer die Leitregion einer Postleitzahl zurück:
87546 -> 8
03257 -> 0
45789 -> 4
usw.

jetzt habe ich das Problem, dass ich das bei den gewichten nicht so einfach machen kann:
Da soll ich eine Einteilung in der Art machen:
0-99 kg -> Klasse 1
100- 300-> Klasse 2
301-500-> Klasse 3
usw.
15000-20000-> Klasse 10
>20000 -> Klasse 11

Jetzt würde ich auch gerne eine SQL Abfrage starten die meine Gewichte in Klassen einteilt.
Momentan starte ich dafür ca. 10 Abfragen die ungefähr so aussehen:
select „1“ as gewichts_klasse from … where gewicht >=0 and gewicht =100 and gewicht

Mahlzeit,

Ich weiß runden gibt es nicht, aber bei Access heißt die
Funktion int() im SQL Standard heißt es trunc() (glaub ich
mal…)

und ich wüßte gern, mit welchem RDBMS du arbeitest.

Jetzt würde ich auch gerne eine SQL Abfrage starten die meine
Gewichte in Klassen einteilt.
Momentan starte ich dafür ca. 10 Abfragen die ungefähr so
aussehen:
select „1“ as gewichts_klasse from … where gewicht >=0
and gewicht =100
and gewicht

select Iif(bedingung, Jawert, Neinwert)
from tabelle;
Lustigerweise kann das kaskadiert werden, wenn z.B. als Neinwert wieder ein Iif-Ausdruck steht:

select iif(gewicht \> 1000, 10, 
 iif(gewicht \> 900, 9,
 iif(gewicht \> 800, 8,
 ...
 ))))
 from tabelle;

Das geht bei allen möglichen Vergleichen, z.B. auch mit Stringwerten. Bei deinem Beispiel zeigt sich aber, daß die Gewichtsklasse rechnerisch aus dem Gewicht zu ermitteln ist: sie entspricht der ganzzahligen Division des Gewichts durch 100.

Gruß

Sancho

Ich weiß runden gibt es nicht, aber bei Access heißt die
Funktion int() im SQL Standard heißt es trunc() (glaub ich
mal…)

und ich wüßte gern, mit welchem RDBMS du arbeitest.

Momentan leider Access, das ganze soll aber demnächst auf einen SQL Server (MS-SQL oder Oracle) kommen.

select Iif(bedingung, Jawert, Neinwert)
from tabelle;
Lustigerweise kann das kaskadiert werden, wenn z.B. als
Neinwert wieder ein Iif-Ausdruck steht:

select iif(gewicht > 1000, 10,
iif(gewicht > 900, 9,
iif(gewicht > 800, 8,

))))
from tabelle;

Vielen Dank! Das hat wunderbar funktioniert!

Es ist leider nicht so einfach zu berechnen. Hab vielleicht zu wenig klassen hingeschrieben. Die grenzen sind bei 100, 300, 500, 700, 1000, 2000, 3000, 5000 usw…

wen es interessiert mein SQL ausdruck sieht jetzt so aus:

SELECT IIf(gewicht\_kg\>20000,13,
 IIf(gewicht\_kg\>15000,12,
 IIf(gewicht\_kg\>10000,11,
 IIf(gewicht\_kg\>7000,10,
 IIf(gewicht\_kg\>5000,9,
 IIf(gewicht\_kg\>3000,8,
 IIf(gewicht\_kg\>2000,7,
 IIf(gewicht\_kg\>1000,6,
 IIf(gewicht\_kg\>700,5,
 IIf(gewicht\_kg\>500,4,
 IIf(gewicht\_kg\>300,3,
 IIf(gewicht\_kg\>100,2,1)))))))))))) 
 AS gewichtsklasse
FROM tbl\_sendedaten;

Wenn ich mir jetzt noch vorstelle, dass ich das noch in die andere Abfrage einbaue (mit der PLZ und vielen anderen Sachen) dann ist das richtig komplex. Hatte sowas zuvor noch nie gesehen…

Vielen Dank nochmal für die Hilfe. Das hat mir sehr weiter geholfen.

Matthias

Hi!

Momentan leider Access, das ganze soll aber demnächst auf
einen SQL Server (MS-SQL oder Oracle) kommen.

Am SQL-Server funktionierts mit „case […] when […] then […] else […]“ und unter Oracle mit einem ziemlich schwerfälligem „decode“ (der Bereich ist hier das Problem)

Warum machst Du aus der Klassifizierung nicht eine eigene Tabelle, die Du mitjoinst, so a la

Tabelle KLASSE
KLASSE MIN\_WERT MAX\_WERT
------------------------
1 0 100
2 101 300
3 301 500

und dann mit

select felder\_bis\_zum\_abwinken,K.KLASSE
from tabellen\_bis\_zum\_abwinken, KLASSE K
where verknüpfungen\_bis\_zum\_abwinken
and das\_zu\_klassifizierende\_feld between K.MIN\_WERT and K.MAX\_WERT

Hätte den zusätzlichen Vorteil, daß Du so gleich noch mehr veschiedene Klassifizierungen reinschmeißen könntest.

Grüße,
Tomh

1 Like