bestimmte Tage in Umsatz Abfrage ausschließen

Datenbanklösungen mit AOO/LO

Moderator: Moderatoren

seballa
**
Beiträge: 24
Registriert: So, 18.09.2005 10:38

bestimmte Tage in Umsatz Abfrage ausschließen

Beitrag von seballa »

Hi,

ich habe eine Tabelle mit Umsatzdaten die ich in einer Abfrage nach Wochentagen gruppiert ausgebe.

Code: Alles auswählen

SELECT 
DAYNAME( "DATUM" ), 
SUM( "Tagesumsatz_Gesamt"."Umsatz Haus" ), 
SUM( "Tagesumsatz_Zimmer"."UmsatzZimmer" ),
 SUM( "Mittagsumsatz_Restaurant"."Mittagsumsatz Restaurant" ), 
SUM( "Abdendumsatz_Restaurant"."Abendumsatz Restaurant" )
 FROM "Tagesumsatz_Restaurant", "Tagesumsatz_Gesamt", "Tagesumsatz_Zimmer", "Mittagsumsatz_Restaurant", "Abdendumsatz_Restaurant"
WHERE "Tagesumsatz_Restaurant"."DATUM" = "Tagesumsatz_Gesamt"."DATUM" 
AND "Tagesumsatz_Zimmer"."DATUM" = "Tagesumsatz_Restaurant"."DATUM" 
AND "Mittagsumsatz_Restaurant"."DATUM" = "Tagesumsatz_Zimmer"."DATUM" 
AND "Abdendumsatz_Restaurant"."DATUM" = "Mittagsumsatz_Restaurant"."DATUM" 
GROUP BY DAYNAME( "DATUM" )
 ORDER BY SUM( "Tagesumsatz_Gesamt"."Umsatz Haus" ) DESC
Jetzt würde ich gerne eine weitere Abfragen erstellen wobei bestimmte Termine, die in einer extra Tabelle stehen nicht berücksichtigt werden. Ich habe aber nen Denkfehler oder nen falschen Ansatz.

Code: Alles auswählen

...
 AND "Tagesumsatz_Zimmer"."DATUM" <> (Select "NichtDieseTage"."Datum" From "NichtDieseTage" Where "NichtDieseTage"."Datum" = "Tagesumsatz_Zimmer"."DATUM" )  GROUP BY DAYNAME( "DATUM" ) ORDER BY SUM( "Tagesumsatz_Gesamt"."Umsatz Haus" ) DESC
Vielen Dank für Hilfe
RobertG
********
Beiträge: 2057
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: bestimmte Tage in Umsatz Abfrage ausschließen

Beitrag von RobertG »

Wenn Du einen Subselect hast darf dieser entweder nur genau einen Wert wiedergeben oder er muss über die Bedingung "IN" verknüpft sein. Bei Dir müsste das lauten:

Code: Alles auswählen

... AND "Tagesumsatz_Zimmer"."DATUM" NOT IN (Select "Datum" From "NichtDieseTage") ...
Gruß

Robert
seballa
**
Beiträge: 24
Registriert: So, 18.09.2005 10:38

Re: bestimmte Tage in Umsatz Abfrage ausschließen

Beitrag von seballa »

Hi,

danke für die Antwort, die Anfrage funktioniert dauert aber sehr lange und liefert viel zu hohe ergebnisse.
Ich denke ich habe irgendwo einen konzeptionsfehler. Ich versuch mal knapp zu beschreiben was ich vor habe.
Ich habe eine große Tabelle mit Buchungen aus einer Registrierkasse.
Zunächst habe ich mir ein paar Abfragen erfolgreich erstellt jeweils sum(menge*preis) nach Datum gruppiert:
*Tagesumsatz
*Tagesumsatz einer bestimmten Warengruppe
*TagesumsatzVormittag
*TagesumsatzNachmittag

Jetzt möchte ich im zweiten Schritt eine Übersichtstabelle erstellen. Ich das geht schon richtig, aber wie ich inzwischen gesehen habe ist hier schon ein Problem. Wenn in einer der Abfragen ein Umsatz 0 ist (weil z.b. am 11.04.2012 kein Vormittags Umsatz war) wird der ganze Tag nicht angezeigt. Ich müsste also einen Outer Join über alle Tabellen machen. Base will aber nicht so wie ich.

Im dritten Schritt (das ist die Abfrage die ich oben gepostet habe) möchte ich dann die Umsätze nach Wochentag gruppiert haben, das funktioniert allerdings fehlen auch hier Umsätze gleiches Probelm wie Schritt 2

In Schritt vier wollte ich einige Umsatztage aus der Wochentag Rechnung ausschließen.

Hier sitz ich nun, mein Kopf qualmt und ich komm nicht weiter.

Seballa
RobertG
********
Beiträge: 2057
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: bestimmte Tage in Umsatz Abfrage ausschließen

Beitrag von RobertG »

Hallo Seballa
seballa hat geschrieben: danke für die Antwort, die Anfrage funktioniert dauert aber sehr lange und liefert viel zu hohe ergebnisse.
Abfragen dieser Art, die sich auf eine bestimmte Menge beziehen, dauern leider immer etwas länger, da ja ein entsprechender Vergleich mit einer ganzen Menge Daten durchgeführt werden muss. Schneller laufen die Abfragen, wenn sie sich auf ein Schlüsselfeld oder Indexfeld beziehen.
seballa hat geschrieben: Jetzt möchte ich im zweiten Schritt eine Übersichtstabelle erstellen. Ich das geht schon richtig, aber wie ich inzwischen gesehen habe ist hier schon ein Problem. Wenn in einer der Abfragen ein Umsatz 0 ist (weil z.b. am 11.04.2012 kein Vormittags Umsatz war) wird der ganze Tag nicht angezeigt. Ich müsste also einen Outer Join über alle Tabellen machen. Base will aber nicht so wie ich.

Joins kann Base nicht so gut, vor allem wenn das mehrere werden. Die mache ich grundsätzlich direkt in SQL.
Wenn der Umsatz nicht 0 ist sondern als Ergebnis ein leeres Feld ergibt, dann wird der Tag nicht angezeigt - nehme ich an. Das ist so ähnlich wie die Verknüpfung von Daten, von denen ein Teil leer ist. Mit NULL (dem Begriff für eine leere Zelle) kann SQL nicht rechnen - also wird das Ergebnis der Rechnung auch NULL. Dem kannst Du entgehen, wenn Du IFNULL("Umsatz_Vormittag",0) schreibst. Wenn also das Feld leer ist gibst Du die Anweisung, dass es die Zahl 0 einnehmen soll.
seballa hat geschrieben: Im dritten Schritt (das ist die Abfrage die ich oben gepostet habe) möchte ich dann die Umsätze nach Wochentag gruppiert haben, das funktioniert allerdings fehlen auch hier Umsätze gleiches Probelm wie Schritt 2.
Also auch die gleiche Lösungsstrategie ...
seballa hat geschrieben: In Schritt vier wollte ich einige Umsatztage aus der Wochentag Rechnung ausschließen.
Ich würde versuchen, das Ganze über Ansichten zu beschleunigen. Abfragen werden immer erst von der GUI verarbeitet. Ansichten von der Datenbank sofort. Außerdem könnte ein Index auf das abgefragte Datumsfeld eventuell zu einer Beschleunigung beitragen.

Gruß

Robert
seballa
**
Beiträge: 24
Registriert: So, 18.09.2005 10:38

Re: bestimmte Tage in Umsatz Abfrage ausschließen

Beitrag von seballa »

Hallo Robert,

vielen Dank für die Hifle! Ich kann zwar nachvollziehen was du mir erklärst, leiderfunktioniert das aber nicht: Ich habs auf die Spitze getriben und die IFNULL Funktion auch auf die Where Klauseln angewand weil ja in der Tabelle "Tagesumsatz_Restaurant" das Datum ger nicht existiert an dem kein Umsatz stattgefunden hat. Es werde aber immer noch keine Tage angezeigt an denen der Restaurant Umsatz null ist (Gesamtumsatz ist vorhanden und wird auch angezeigt).

Code: Alles auswählen

SELECT 
"Tagesumsatz_Gesamt"."DATUM", "Tagesumsatz_Gesamt"."Umsatz Haus", 	IFNULL("Tagesumsatz_Restaurant"."UmsatzRestaurant",0) 
	FROM 
"Tagesumsatz_Restaurant", "Tagesumsatz_Gesamt" 
	WHERE
IFNULL("Tagesumsatz_Restaurant"."DATUM","Tagesumsatz_Gesamt"."DATUM") = 
	"Tagesumsatz_Gesamt"."DATUM"
ABER!
Ich habs mit Left outer joins per hand dann doch hinbekommen, die von der GUI erstellten Links haben nie funktioniert:

Code: Alles auswählen

Select ***
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" }
Jetzt fehlt nur noch Punkt 4 mit dem Ausschluss der einzelnen Tage das muss aber ein paar Stunden warten, geh jetzt schlafen.

Nochmal Danke

Seballa
RobertG
********
Beiträge: 2057
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: bestimmte Tage in Umsatz Abfrage ausschließen

Beitrag von RobertG »

Hallo Seballa,

ich habe das Ganze einmal in ein kleines Datenbänkchen gepackt, da ich für das Base-Handbuch von LibreOffice sowieso gerade verschiedene Datenbankformen durchprobieren musste:
Summierung der Sparten, Summierung des gesamten Tages, ausstehende Beträge und Datumsausschluss - wozu immer Du den brauchst. Jetzt fehlen mir natürlich die entsprechenden Datenmengen um die Geschwindigkeit zu testen.

Gruß

Robert
Dateianhänge
Pension.odb
Summierung mit korrelierender Unterabfrage, Ausschluss von NULL und Ausschluss bestimmter weiterer Werte
(6.67 KiB) 69-mal heruntergeladen
seballa
**
Beiträge: 24
Registriert: So, 18.09.2005 10:38

Re: bestimmte Tage in Umsatz Abfrage ausschließen

Beitrag von seballa »

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
RobertG
********
Beiträge: 2057
Registriert: Fr, 13.04.2012 19:28
Kontaktdaten:

Re: bestimmte Tage in Umsatz Abfrage ausschließen

Beitrag von RobertG »

Hallo Seballa,
seballa hat geschrieben: 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 meiner Ubuntumaschine ständig ab. Auf Windows läufts stabiler aber auch nicht das wahre. Im Grunde kann ich zwar mit dem intergrierten Wizard leben einen Gruppensummierung z.B. wäre allerdings schon schön.
Meine Erfahrung mit dem Report-Designer: Absturzgefährdet beim Editieren eines Reports. Läuft aber stabil, wenn der Report erst einmal steht. Bei mir ist die Konfiguration allerdings ein bisschen anders: OpenSuSE 11.4 mit OOo 3.3 oder LO 3.3.4 oder LO 3.5.3 RC1.

Gruß

Robert
Antworten