Hallo Robert,
vielen Dank für deine Hilfe, durch dich hab ich meine Probleme gelöst. Ich hatte die letzten Tage viel arbeit, deshalb die späte Antwort.
Vielleicht kann ich ja anderen helfen, deshalb hier meine Problem mit Lösung:
Grundlage ist die History aus meiner Gastro Registrierkasse. Darin sind alle Buchungen Stornos usw. enthalten. Die DB ist im dbase Format und ich habe Sie in eine HSQLDB Datenbank importiert. (Das klappt ganz gut, man muss aber eventuell beim erstellen der Tabelle per Hand die Datentypen anpassen).
Ziel ist es eine Umsatzabfrage geordnet nach Tagen zu erstellen, 7% Umsätze (Hotel) und 19% Umsätze (Gastro) sollen getrennt werden.
Außerdem möchte ich eine Auflistung nach Wochentagen gruppiert.
Erstmal die Buchungen filtern, da in der Datenbank auch Rechnungen, Abschlüsse usw. aufgelistet sind.
Code: Alles auswählen
SELECT "DATUM" ,
"MENGE" ,
"WG" ,
"PREIS" ,
"ARTIKEL",
"NAME" ,
"ZEIT" ,
"KELLNER",
"MWST"
FROM "hist_dat"
WHERE "ARTIKEL" > 0
AND "KELLNER" = 2
Dann die Umsätze nach Tagen und Steuersatz gruppieren
Code: Alles auswählen
SELECT SUM( "MENGE" * "PREIS" ) AS "Umsatz Haus" ,
"DATUM" ,
"MWST" ,
SUM( "MENGE" * "PREIS" / ( ( 100 + "MWST" ) / 100 ) ) AS "Netto",
MONTH( "DATUM" ) AS "Monat",
YEAR( "DATUM" ) AS "Jahr"
FROM "AlleBuchungen"
GROUP BY "DATUM",
"MWST"
ORDER BY "DATUM",
"MWST"
Nun neue Aufgabe: Nach Wochentag gruppiert und dabei nur den Restaurantumsatz getrennt nach Mittagsservice und Abendservice berücksichtigen. Hier wars für mich schon recht spannend:
Restaurant Umsätze gesammt
Code: Alles auswählen
SELECT SUM( "MENGE" * "PREIS" ) AS "UmsatzRestaurant",
"DATUM"
FROM "AlleBuchungen"
WHERE "WG" <> 96
AND "WG" <> 95
GROUP BY "DATUM"
Alle Mittagsumsätze
Code: Alles auswählen
SELECT SUM( "MENGE" * "PREIS" ) AS "Mittagsumsatz Restaurant",
"DATUM"
FROM "AlleBuchungen"
WHERE "WG" <> 96
AND "WG" <> 95
AND CAST( LEFT( "ZEIT", 2 ) AS INTEGER ) < '16'
GROUP BY "DATUM"
Alle Abendumsätze
Code: Alles auswählen
SELECT SUM( "MENGE" * "PREIS" ) AS "Abendumsatz Restaurant",
"DATUM"
FROM "AlleBuchungen"
WHERE "WG" <> 96
AND "WG" <> 95
AND CAST( LEFT( "ZEIT", 2 ) AS INTEGER ) > '15'
GROUP BY "DATUM"
Und alles Zusammen in einer Abfrage kombiniert. Ich habe LEFT OUTER JOIN benutzt, funktioniert auch mit IFNULL("Abfragenergebnis", 0)
Code: Alles auswählen
SELECT DAYNAME( "DATUM" ) AS "Wochentag" ,
SUM( "Tagesumsatz_Gesamt"."Umsatz Haus" ) AS "Haus" ,
SUM( "Tagesumsatz_Zimmer"."UmsatzZimmer" ) AS "Zimmer" ,
SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ) AS "Mittag" ,
SUM( "Abendumsatz_Restaurant"."Abendumsatz Restaurant" ) AS "Abend" ,
IFNULL( SUM( "Abendumsatz_Restaurant"."Abendumsatz Restaurant" ), 0 ) + IFNULL( SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ), 0 ) AS "Restaurant gesamt",
SUM( "Tagesumsatz_Gesamt"."Umsatz Haus" ) / COUNT( DAYNAME( "DATUM" ) ) AS "SchnittGesamt" ,
SUM( "Tagesumsatz_Zimmer"."UmsatzZimmer" ) / COUNT( DAYNAME( "DATUM" ) ) AS "SchnittZimmer" ,
SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ) / COUNT( DAYNAME( "DATUM" ) ) AS "SchnittMittag" ,
SUM( "Abendumsatz_Restaurant"."Abendumsatz Restaurant" ) / COUNT( DAYNAME( "DATUM" ) ) AS "SchnittAbend" ,
( IFNULL( SUM( "Abendumsatz_Restaurant"."Abendumsatz Restaurant" ), 0 ) + IFNULL( SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ), 0 ) ) / COUNT( DAYNAME( "DATUM" ) ) AS "Schnitt Restaurant"
FROM { OJ "Tagesumsatz_Gesamt"
LEFT OUTER JOIN "Tagesumsatz_Restaurant"
ON "Tagesumsatz_Gesamt"."DATUM" = "Tagesumsatz_Restaurant"."DATUM"
LEFT OUTER JOIN "Tagesumsatz_Zimmer"
ON "Tagesumsatz_Gesamt"."DATUM" = "Tagesumsatz_Zimmer"."DATUM"
LEFT OUTER JOIN "Mittagsumsatz_Restaurant"
ON "Tagesumsatz_Gesamt"."DATUM" = "Mittagsumsatz_Restaurant"."DATUM"
LEFT OUTER JOIN "Abendumsatz_Restaurant"
ON "Tagesumsatz_Gesamt"."DATUM" = "Abendumsatz_Restaurant"."DATUM" }
WHERE "Tagesumsatz_Gesamt"."DATUM" NOT IN
( SELECT "Datum"
FROM "Feiertage"
)
GROUP BY DAYNAME( "DATUM" )
ORDER BY "Haus" DESC
Und als krönender Abschluss das ganze nochmal, wobei Feiertage die auf einen Wochentag fallen nicht berücksichtigt werden sollen, diese Ausschlusstage stehen in einer extra Tabelle Feiertag.
Code: Alles auswählen
SELECT DAYNAME( "DATUM" ) AS "Wochentag" ,
SUM( "Tagesumsatz_Gesamt"."Umsatz Haus" ) AS "Haus" ,
SUM( "Tagesumsatz_Zimmer"."UmsatzZimmer" ) AS "Zimmer" ,
SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ) AS "Mittag" ,
SUM( "Abendumsatz_Restaurant"."Abendumsatz Restaurant" ) AS "Abend" ,
IFNULL( SUM( "Abendumsatz_Restaurant"."Abendumsatz Restaurant" ), 0 ) + IFNULL( SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ), 0 ) AS "Restaurant gesamt",
SUM( "Tagesumsatz_Gesamt"."Umsatz Haus" ) / COUNT( DAYNAME( "DATUM" ) ) AS "SchnittGesamt" ,
SUM( "Tagesumsatz_Zimmer"."UmsatzZimmer" ) / COUNT( DAYNAME( "DATUM" ) ) AS "SchnittZimmer" ,
SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ) / COUNT( DAYNAME( "DATUM" ) ) AS "SchnittMittag" ,
SUM( "Abendumsatz_Restaurant"."Abendumsatz Restaurant" ) / COUNT( DAYNAME( "DATUM" ) ) AS "SchnittAbend" ,
( IFNULL( SUM( "Abendumsatz_Restaurant"."Abendumsatz Restaurant" ), 0 ) + IFNULL( SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ), 0 ) ) / COUNT( DAYNAME( "DATUM" ) ) AS "Schnitt Restaurant"
FROM { OJ "Tagesumsatz_Gesamt"
LEFT OUTER JOIN "Tagesumsatz_Restaurant"
ON "Tagesumsatz_Gesamt"."DATUM" = "Tagesumsatz_Restaurant"."DATUM"
LEFT OUTER JOIN "Tagesumsatz_Zimmer"
ON "Tagesumsatz_Gesamt"."DATUM" = "Tagesumsatz_Zimmer"."DATUM"
LEFT OUTER JOIN "Mittagsumsatz_Restaurant"
ON "Tagesumsatz_Gesamt"."DATUM" = "Mittagsumsatz_Restaurant"."DATUM"
LEFT OUTER JOIN "Abendumsatz_Restaurant"
ON "Tagesumsatz_Gesamt"."DATUM" = "Abendumsatz_Restaurant"."DATUM" }
WHERE "Tagesumsatz_Gesamt"."DATUM" NOT IN
( SELECT "Datum"
FROM "Feiertage"
)
GROUP BY DAYNAME( "DATUM" )
ORDER BY "Haus" DESC
Das ganze dann noch schön in Reports verpackt, da sind die Abfragen schöner und schneller. Leider stürzt der Oracle Report Designer auf meiener Ubunutmaschine ständig ab. Auf Windows läufts stabiler aber auch nicht das wahre. Im Grude kann ich zwar mit dem intergrierten Wizard leben einen Gruppensummierung z.B. wäre allerdings schon schön.
Nochmals Danke Robert.
MFG
Seballa