Firebird SQL Abfrage

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
aebding
Beiträge: 14
Registriert: Mo 5. Okt 2009, 00:08

Firebird SQL Abfrage

Beitrag von aebding »

Hallo Leute,

ich bräuchte bitte Eure Hilfe bei folgendem Problem :

Tabelle :
KassenNr Char 3
BelegNr Char 10
Position Char 3
Datum Date
Uhrzeit Time
Umsatz DOUBLE PRECISION

Ich möchte eine Liste erstellen mit dem Gesamtumsatz in den Zeiten von
00:00:00 - 07:59:59
08:00:00 - 08:59:59
09:00:00 - 09:59:59
....
15:00:00 - 15:59:59
16:00:00 - 16:59:59
17:00:00 - 23:59:59
jeweils pro "KassenNr" und Tag ...

Wie könnte ich das am besten/einfachsten lösen ?
Vielen Dank ...

** Lazarus 1.8.0 RC5, Firebird 2.5.7, ZEOS 7.2 **

charlytango
Beiträge: 842
Registriert: Sa 12. Sep 2015, 12:10
OS, Lazarus, FPC: Laz stable (2.2.6, 3.x)
CPU-Target: Win 32/64, Linux64
Wohnort: Wien

Re: Firebird SQL Abfrage

Beitrag von charlytango »

Hi
.. für mich stellt sich dabei die Frage nach dem Zweck der Liste -- soll sie Selbstzweck sein, oder dient sie zur Aufbereitung in einem Chart oder Report? da wäre dann die Formatierung der Liste eine andere


Code: Alles auswählen

CREATE VIEW v_belege AS
SELECT
b.*,
CASE WHEN HOUR(uhrzeit) <= 8 THEN 1
     WHEN HOUR(uhrzeit) BETWEEN 8 AND 9 THEN 8
     ......
     WHEN HOUR(uhrzeit) >= 17 THEN 17
     ELSE -1
END AS stunde
FROM
belege AS b


dann hast du eine Tabelle die nach deinen Vorgaben getagged ist, Die kannst du zu Summierungen und Gruppierungen heranziehen. Falls der Kunde irgendwann mal eine andere Zeiteinteilung braucht, musst du nur den View ändern (evtl auch vom Programm aus)

zum Summieren sieh dir mal das an:
http://www.mysqltutorial.org/mysql-sum/
https://stackoverflow.com/questions/883 ... all-rollup

und falls du Gesamtsummen benötigst sieh die diese Syntax an:

Code: Alles auswählen

SELECT 
stunde, KassenNr, sum(Umsatz)
FROM
v_belege
GROUP BY stunde, KassenNr WITH ROLLUP


falls du es etwas heftiger haben möchtest kannst du den Zweck des View (Stundentagging) auch in die Abfrage einbauen
irgendwas wie:

Code: Alles auswählen

SELECT 
CASE WHEN HOUR(uhrzeit) <= 8 THEN 1
     WHEN HOUR(uhrzeit) BETWEEN 8 AND 9 THEN 8
     ......
     WHEN HOUR(uhrzeit) >= 17 THEN 17
     ELSE -1
END AS stunde
,KassenNr
, sum(Umsatz)
FROM
umsatz
GROUP BY stunde, KassenNr WITH ROLLUP
ORDER BY stunde, KassenNr


WITH ROLLUP macht dir die Geamtsummen und Zwischensummen -- für einen Report oder Chart weglassen, statdessen mit ORDER
Keine Ahnung ob das bei Firebird so klappt, bei MySQL klappt es.
so mal ins unreine und ungetestet reingetippt....

CT

aebding
Beiträge: 14
Registriert: Mo 5. Okt 2009, 00:08

Re: Firebird SQL Abfrage

Beitrag von aebding »

Hallo charlytango,

vielen Dank für die Anregungen ...

Die Werte sollen per LazReport ausgegeben werden und dienen der Personalplanung, z.B. wann ist der größte Andrang usw.

Werde das heute Abend mal testen und mich wieder melden ...

Antworten