Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   2x Sum aus gleichem Feld unterschiedliche Bedingung (https://www.delphipraxis.net/215108-2x-sum-aus-gleichem-feld-unterschiedliche-bedingung.html)

tkhandel 10. Mai 2024 07:08

Datenbank: Interbase • Version: 2020 • Zugriff über: Delphi 12

2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Hallo,

ich bräuchte mal einen Ansatz für das folgende Abfrage Problem

eine Tabelle (TagesUmsatz) enthält alle Verkäufe eines Tages:

Id, MitarbeiterNr, Datum, UmsatzBrutto, Zahlart


Ergebnis soll sein:

MitarbeiterNr, Umsatz, Bar, Karte

folgende Abfrage

Select
FahrerNr,
Sum(VKBG) as Umsatz
from Tagesumsatz
where cast(Datum as Date) = '06.05.2024'
Group by FahrerNr

UNION

Select
FahrerNr,
Sum(VKBG) as Bar
from Tagesumsatz
where cast(Datum as Date) = '06.05.2024' and Zahlart = 3
Group by FahrerNr

liefert zwar das Ergebnis aber nicht zwei Spalten sondern untereinander was bei vielen fahreren zu unübersichtlich wird, wie bekomme ich die nebeneinander ?

Klaus01 10. Mai 2024 07:15

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
.. könnte der Ansatz auch etwas für Dich sein?

Grüße
Klaus

TurboMagic 10. Mai 2024 07:53

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Zitat:

Zitat von Klaus01 (Beitrag 1536542)
.. könnte der Ansatz auch etwas für Dich sein?

Grüße
Klaus

Hallo,

man könnte damit versuchen eine Liste aus Mitarbeiter ID, Zahlart und Betrag zu erzeugen, aber
eine Liste mit MitarbeiterID, Summe Bar, Summe Karte? Da fehlt mir noch ein bisschen der Ansatz.

Grüße
TurboMagic

Jasocul 10. Mai 2024 07:55

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Das wäre mein Ansatz:
Code:
Select
FahrerNr,
(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = '06.05.2024') as UmsatzGesamt,
(Select Sum(VKBG)
from Tagesumsatz x
where x.FahrerNr = TU.FahrerNr
and cast(Datum as Date) = '06.05.2024' and Zahlart = 3) as UmsatzZA3
from Tagesumsatz TU
Group by FahrerNr
Natürlich ungeprüft.

Außerdem ist es meistens ungünstig, die DB-Felder zu CASTen, da dadurch der Index nicht mehr genutzt werden kann. Es ist i.d.R. besser, den Parameter zu CASTen.

Uwe Raabe 10. Mai 2024 08:04

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Du hast bei Zugriff Delphi 12 angegeben. Das sagt aber noch nichts über die verwendeten Zugriffskomponenten (z.B. FireDAC, IBDAC, IBExpress...) aus.

Papaschlumpf73 10. Mai 2024 08:36

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Mit einem SQL-Server würde ich das so machen; keine Ahnung, ob das auch mit Interbase geht:
Code:
Select
FahrerNr, Sum(VKBG) as Umsatz, SUM(CASE WHEN Zahlart=3 THEN VKNG ELSE 0 END) AS Bar
from Tagesumsatz
where cast(Datum as Date) = '06.05.2024'
Group by FahrerNr

tkhandel 10. Mai 2024 08:44

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1536547)
Du hast bei Zugriff Delphi 12 angegeben. Das sagt aber noch nichts über die verwendeten Zugriffskomponenten (z.B. FireDAC, IBDAC, IBExpress...) aus.

ich würde das als Sicht in der IB anlegen der ich dann das Tagesdatum zur Auswertung einfach übergebe ich denke das geht schneller.

Olli73 10. Mai 2024 08:53

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1536552)
Mit einem SQL-Server würde ich das so machen; keine Ahnung, ob das auch mit Interbase geht:
Code:
Select
FahrerNr, Sum(VKBG) as Umsatz, SUM(CASE WHEN Zahlart=3 THEN VKNG ELSE 0 END) AS Bar
from Tagesumsatz
where cast(Datum as Date) = '06.05.2024'
Group by FahrerNr

Ja, sowas wollte ich auch gerade schreiben.


warum aber eigenlich
Code:
cast(Datum as Date) = '06.05.2024'
? Wenn Datum als Date in der Datenbank angelegt ist, sollte ein
Code:
Datum = '06.05.2024'
reichen. Oder noch besser: man verwendet Parameter. Wie schon geschrieben wurde, ist das auch wichtig für die Nutzung eines Indexes.

Papaschlumpf73 10. Mai 2024 08:56

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Vielleicht ist es ein DateTime-Feld mit Uhrzeit drin.

tkhandel 10. Mai 2024 09:00

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Der Ansatz von Jasocul war genau das was ich wollte also besten Dank für die Unterstützung!!

tkhandel 10. Mai 2024 09:01

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Zitat:

Zitat von Papaschlumpf73 (Beitrag 1536555)
Vielleicht ist es ein DateTime-Feld mit Uhrzeit drin.

ja genau es ist ein Timesstamp da auch die Uhrzeit des Verkaufs festgehalten wird

Olli73 10. Mai 2024 09:22

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Zitat:

Zitat von tkhandel (Beitrag 1536557)
ja genau es ist ein Timesstamp da auch die Uhrzeit des Verkaufs festgehalten wird

Könnte, wie schon jemand geschrieben hat, Probleme mit Index geben, also langsam werden bei "Großkunden".

Außerdem sollte das SQL von Papaschlumpf73 performanter sein...

Ich kenn das, man testet mit einer "kleinen" Datenbank, alles perfekt und der Kunde verflucht dann die Performance...

Uwe Raabe 10. Mai 2024 10:01

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Die vollständige Anweisung sähe in etwa so aus (Zahlart ist leider noch etwas vage beschrieben, daher nehme ich alles <> 3 als Karte):
SQL-Code:
select
 FahrerNr as MitarbeiterNr,
 Sum(VKBG) as Umsatz,
 SUM(CASE WHEN Zahlart=3 THEN VKNG ELSE 0 END) AS Bar,
 SUM(CASE WHEN Zahlart<>3 THEN VKNG ELSE 0 END) AS Karte
from Tagesumsatz
where cast(Datum as Date) = '06.05.2024'
Group by FahrerNr

tkhandel 10. Mai 2024 10:12

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Hallo Uwe,
Zahlart ist eine int Bar = 1, LS = 2, Karte = 3

da bekomme in deiner variante die Fehlermeldung:

Error at line 1 expression evaluation not supported

Uwe Raabe 10. Mai 2024 11:32

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
Zitat:

Zitat von tkhandel (Beitrag 1536560)
Zahlart ist eine int Bar = 1, LS = 2, Karte = 3

In dem Fall ist das Beispiel im Eingangspost aber aber auch falsch, denn dort wird bei Zahlart = 3 die Summe als Bar zurückgegeben.

Zitat:

Zitat von tkhandel (Beitrag 1536560)
Error at line 1 expression evaluation not supported

OK, die Interbase Syntax ist da noch etwas anders als ich das in Erinnerung hatte (mit FireDAC wird das erfreulicherweise datenbankunabhängig wegabstrahiert). So sollte es gehen:
SQL-Code:
select
 FahrerNr as MitarbeiterNr,
 Sum(VKBG) as Umsatz,
 SUM(CASE Zahlart WHEN 1 THEN VKNG ELSE 0 END) AS Bar,
 SUM(CASE Zahlart WHEN 2 THEN VKNG ELSE 0 END) AS LS,
 SUM(CASE Zahlart WHEN 3 THEN VKNG ELSE 0 END) AS Karte
from Tagesumsatz
where cast(Datum as Date) = '06.05.2024'
Group by FahrerNr

tkhandel 10. Mai 2024 12:04

AW: 2x Sum aus gleichem Feld unterschiedliche Bedingung
 
ja das stimmt Uwe, wollte nur schnell das Problem schildern


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz