PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [SQL] Zählen und Berechnen



Overlord04
03-12-2004, 21:50
Hallo,

ich stehe vor einem Problem, wo ich nicht auf die Lösung komme.
Ich möchte gerne eine SELECT-Anweisung machen, die mir Gebühren berechnet. Diese Gebühren stehen in Stufen von 0 - 2 in einer Tabelle.
Stufe 1 macht 5€, Stufe 2 macht 10€.

Ich möchte jetzt für jede Person die Gebühren berechnen lassen.
Normalerweise ist es ja bei einer einzigen Stufe ganz einfach. Ich mache einfach ein SELECT, wo ich alle Stufen einer Person zusammenzähle, also mit COUNT und dann einfach * z.B. 5 nehme. Dann bekomme ich ja, die Gesamtgebühren heraus. Nur wie mache ich das bei unterschiedlichen Stufen, aber in EINER Abfrage.

Ich kann ja nicht sagen: SELECT ... , SUM(COUNT(WHERE STUFE LIKE '1')*5 AND COUNT(WHERE STUFE LIKE '2')*10) AS GESAMTGEBUEHREN.

Im Prinzip sollte es ja so aussehen, aber ich bekomme es nicht realisiert.

Ich hoffe, ich habe mich mehr oder wenig verständlich ausgedrückt und jemand kann mir helfen.

Danke im Voraus, GRUSS

Hans-Georg Normann
03-12-2004, 22:12
SELECT ... , SUM(COUNT(WHERE STUFE LIKE '1')*5 AND COUNT(WHERE STUFE LIKE '2')*10) AS GESAMTGEBUEHREN

Moment mal! Erst mal Klarheit schaffen. Eine einfache Abfrage sieht so aus:
SELECT ... ,COUNT(*)*5 WHERE STUFE LIKE '1' FROM .....
und dann die zweite Bedingung dazu. Wenn beide Abfragen gleich sind, dann kann man die über UNION verbinden.

andere Variante: Bau ein Tabelle auf mit den Feldern STUFE und GEBUEHR dann kannst du die Tabellen verknüpfen und geht alles ohne UNION.

Hans

Overlord04
04-12-2004, 01:28
Ja, ich weiss, wie eine einfach Abfrage aussieht, aber ich muss ja sowohl die Berechnung mit den 5€ und die mit den 10€ (abhängig von der Stude) in EINE SELECT-Anweisung bekommen.

Bei zwei Abfragen sehe ja nur anders aus, dass ich eben nach STUFE '2' suche und dann zähle und das Ergebnis * 10, anstatt nach 1 und * 5.

Ich weiss nicht, ob Du meinst, dass das mit UNION geht, habe mir UNION noch nicht angeguckt, werde das aber mal jetzt tun.

Das Problem ist ja einfach, dass ich in einer Abfrage die ein und selbe Spalte unterscheidlich behandeln muss. Ist vielleicht ein JOIN sinnvoll ?

Danke schon mal für deine Antwort.

mwanaheri
04-12-2004, 11:00
Hier empfiehlt sich eine Prüftabelle, die nur den Index ('1' oder '2') enthält
und die Gebühr. die bindest du per join ein (eigentlich solltest du sie auch
als foreign key nutzen) und berechnest dann aus dem Join.

Christoph
05-12-2004, 09:04
Vorsicht, von der Lösung mit einer zweiten Tabelle würde ich abraten, es sei denn Du definierst sie als View (sonst besteht die Gefahr der Inkonsistenz).

Was Du vielleicht nicht weißt ist, dass jedes Ergebnis eines SELECT-Statements als Tabelle in einer anderen SELECT-Anweisung wieterverwendet werden, dh. ein SELECT-Statement ist de facto ein "Tabellen-Konstruktor". Beispiel (zugegebenermaßen etwas dämlich, aber sinnvellere Beispiele kannst Du dir ja über legen):


SELECT a.nr, a.name FROM (SELECT rn,name FROM tbl) a;

Overlord04
05-12-2004, 17:05
@Christoph: Danke für den Tipp. Werde das gleich mal probieren.

Gruss

elrond
06-12-2004, 11:15
Vorsicht, von der Lösung mit einer zweiten Tabelle würde ich abraten, es sei denn Du definierst sie als View (sonst besteht die Gefahr der Inkonsistenz).


sehe ich völlig anders! Es ist nicht nur ok sondern empfehlenswert eine Referenztabelle anzulegen, in der die Provisionsstufen beschrieben sind. Ansonsten baut man ständig Hilfskonsruktionen sowohl im Frontend als auch im Backend alá " ...if stufe = 2 then Gebuehr = 10... "

Solche Dinge fallen Dir dann auf den Fuß, wenn sich änderungen ergeben.

ich würde eine Tabelle mit den Feldern

stufe,
giltvon,
giltbis,
betrag

anlegen.

Damit bist du auch bei einer Gebührenänderung auf der sicheren Seite...

Christoph
06-12-2004, 11:48
@elrond

Ja, du hast recht. Ich hatte nur die Fragestellung gelesen und mir das Datenmodell nicht näher angeschaut und folglich nicht bemerkt, dass das Datenmodell etwas verkorkst war.