Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   select sum mit feldausgabe (https://www.delphipraxis.net/189831-select-sum-mit-feldausgabe.html)

HPB 27. Jul 2016 16:03

Datenbank: interbase • Version: xe3 • Zugriff über: ib

select sum mit feldausgabe
 
Guten Tag Delphianer,
zu dem folgenden Problem finde ich die Lösung nicht.
Ich habe eine Tabelle "Kassenbuch" mit den folgenden Feldern:
Datum, KontoNr, KontoName, Zahlung, KontoArt, AuszugsNr

Ich möchte nun folgende Auswertung starten.
Summe alle Einzahlungen mit KontoArt = 'E'
Summe aller Ausgaben mit KontoArt = 'A'
Danach die Felder (Datum, KontoNr, KontoName, Zahlung, AuszugsNr)

Die normale Summenbildung mit:
Delphi-Quellcode:
Select sum(Zahlung) as Einzahlungen, sum(Zahlung) as Ausgabe
from Kassenbuch where extract(year from datum) in (:JahrVon, :pJahrBis)
bildet ja nur die Summen ohne Bedingungen.

Wie muss ich die "Where-Klausel" gestalten, damit die Summenwerte und auch noch die
Felder der Tabelle ausgegeben werden.
Geht dies überhaupt?
Ich hoffe die Darlegung ist nachvollziebar.
Mit Gruß HPB

ConnorMcLeod 27. Jul 2016 16:17

AW: select sum mit feldausgabe
 
Servus,
die Formulierung
Delphi-Quellcode:
Select sum(Zahlung) as Einzahlungen, sum(Zahlung) as Ausgabe
bringt Dir zweimal dieselbe Summe mit unterschiedlichen Feldnamen. Willst Du das?

himitsu 27. Jul 2016 16:20

AW: select sum mit feldausgabe
 
Pssst, der Parameter von SUM hießt in vielen Dokumentationen der meisten DBMS nicht umsonst Value oder Expression und nicht Field. :zwinker:
http://stackoverflow.com/questions/1...ions-with-case
http://docwiki.embarcadero.com/InterBase/XE7/en/SUM(_) ... schau mal was bei <val> (Value) geschrieben steht.

Man kann bei diesen Aggregate-Funktionen auch sagen was gemacht werden soll.
Selbst ORDER BY, DISTINCT und Co. kann da verwendet werden, eventuell auch ein WHERE, je nach DBMS.
SQL-Code:
sum(iif(Zahlung < 0, Zahlung, 0))
sum(iif(Zahlung < 0, Zahlung, NULL))
Die meisten Aggregate-Funktionen werten nur aus, wenn ein Wert ungleich 0 vorkommt,
z.B.
Delphi-Quellcode:
count(*)
zählt alle Zeilen und
Delphi-Quellcode:
count(abc)
zählz nur Datensätze, wo
Delphi-Quellcode:
abc NOT NULL
ist.

SQL-Code:
Select sum(IfThenDeinesDBMS(Zahlung > 0, Zahlung, 0)) as Einzahlungen,
       sum(IfThenDeinesDBMS(Zahlung < 0, Zahlung, 0)) as Ausgabe

-- oder halt

Select sum(IfThenDeinesDBMS(KontoArt = 'E', Zahlung, 0)) as Einzahlungen,
       sum(IfThenDeinesDBMS(KontoArt = 'A', Zahlung, 0)) as Ausgabe

p80286 27. Jul 2016 16:46

AW: select sum mit feldausgabe
 
SQL-Code:
select sum(zahlung),Datum, KontoNr, KontoName, Zahlung, KontoArt, AuszugsNr
where Kontoart='E'
Group by Datum, KontoNr, KontoName, Zahlung, KontoArt, AuszugsNr
wird dir die Summe aller Zahlungen aus Datensätzen mit gleichem Datum, KontoNr, KontoName, Zahlung, Kontoart und AuszugsNr liefern.

willst Du nur eine summe der Zahlungen egal welches Datum, KontoNr, KontoName, Zahlung, KontoArt, AuszugsNr dann nutzt Du

SQL-Code:
select sum(zahlung)
where Kontoart='E'
Willst Du die Summe aller Zahlungen eines Tages und eines Kontos dann nutze
SQL-Code:
select sum(zahlung),Datum, KontoNr
where Kontoart='E'
  and Datum=Mydate
  and KontoNr=MyAccountNo
Group by Datum, KontoNr

Gruß
K-H

himitsu 27. Jul 2016 17:39

AW: select sum mit feldausgabe
 
Zitat:

Zitat von HPB (Beitrag 1343587)
Summe alle Einzahlungen mit KontoArt = 'E'
Summe aller Ausgaben mit KontoArt = 'A'
Danach die Felder (Datum, KontoNr, KontoName, Zahlung, AuszugsNr)

Er will zwei Summen gleichzeitig, die zwar aus dem selben Feld, aber nur je von einem Bruchteil der Datensätze kommt. :zwinker:

So oder so, in "SUM" mußß die Bedingung rein.
Sei es durch Steuern der Aggregate-Funktion SUM oder durch zwei SubSelects.

Uwe Raabe 27. Jul 2016 17:46

AW: select sum mit feldausgabe
 
Die beiden Summen bekommt man einfach mit einem Group by - das gibt dann bei passendem Where zwei Datensätze. Bei den restlichen Feldern verstehe ich noch nicht, was da drin stehen soll. Es gibt ja mehrere Datensätze, die zu diesen Summen zusammengefasst werden.

HPB 27. Jul 2016 17:52

AW: select sum mit feldausgabe
 
zwischenzeitlich habe ich folgendes gefunden: http://www.delphipraxis.net/180963-s...er-felder.html
Das schein das Richtige zu sein (von Uwe Rabe).
Aber die Bedingungen:
Delphi-Quellcode:
 (SELECT SUM(Anteil_A) WHERE RechDatumTeilA IS NULL) + (SELECT SUM(Anteil_B) WHERE RechDatumTeilB IS NULL) AS Ohne_Rechnungen,
 (SELECT SUM(Anteil_A) WHERE not RechDatumTeilA IS NULL) + (SELECT SUM(Anteil_B) WHERE not RechDatumTeilB IS NULL) AS Offene_Rechnungen
will nicht gelingen bzw. kann ich nicht umsetzen.
Delphi-Quellcode:
select
 sum(Zahlung) as Einnahme,
 sum(Zahlung) as Ausgabe,
 (select SUM(Einnahme) where KontoArt = 'E') as Ges_Einnahmen,
 (select SUM(Ausgabe= where KontoArt = 'A') as Ges_Ausgabe


from KASSENBUCH
where extract(year from datum) in (2016, 2016)
Bekomme beim Testen die Fehlermeldung: "Token unknow - line 4, column 23 - Where"
Der obige Code scheint zu funktionieren. Warum ich beim unteren Code
eine Fehlermeldung bekomme kann ich nicht nachvollziehen.
Mit Gruß HPB

himitsu 27. Jul 2016 17:52

AW: select sum mit feldausgabe
 
Billiges Beispiel mit wenigen Daten, über "eine" Gruppe.
SQL-Code:
SELECT sum(c) AS sum_all, sum(iif(x = 'a', c, 0)) AS sum_a, sum(iif(x = 'b', c, 0)) AS sum_b,
  count(*) AS count_all, count(nullif(x = 'a', false)) AS count_a, count(nullif(x = 'b', false)) AS count_b
FROM (VALUES ('a', 1), ('b', 2), ('a', 4), ('a', 8), ('b', 16)) AS temp (x, c)

-- sum_all,sum_a,sum_b,count_all,count_a,count_b = 31,13,18,5,3,2
Noch paar Spalten mehr in die Quelle, in die Ausgabe und ein GroupBy über die zusätzlichen Spalten.

Es gibt auch ein paar DBMS, die können in etwa sowas wie
Delphi-Quellcode:
sum(c WHERE x = 'a')
bzw.
Delphi-Quellcode:
sum(c ON x = 'a')
, oder irgendwie so.

Uwe Raabe 27. Jul 2016 17:57

AW: select sum mit feldausgabe
 
Was ist für den Anfang mit

SQL-Code:
SELECT SUM(Zahlung), KontoArt
WHERE (KontoArt = 'E') or (KontoArt = 'A')
GROUP BY KontoArt
Das sollte doch schon mal die beiden Summen ergeben.

Bleibt immer noch unklar, was mit den übrigen Feldern gemeint ist.

himitsu 27. Jul 2016 18:07

AW: select sum mit feldausgabe
 
:roll:
SQL-Code:
select Kunde,
       sum(Zahlung) as Umsatz, -- alles zusammen, für jeden Kunden
       sum(iif(KontoArt = 'E', Zahlung, 0)) as Eingang, -- nur Einzahlungen des Kunden
       sum(iif(KontoArt = 'A', Zahlung, 0)) as Ausgang  -- nur Auszahlungen des Kunden
from KASSENBUCH
where extract(year from datum) in (2016, 2017)
group by Kunde

select Kunde, extract(year from datum) as Jahr -- pro Kunde und Jahr
       sum(Zahlung) as Umsatz, -- alles zusammen, für jeden Kunden
       sum(iif(KontoArt = 'E', Zahlung, 0)) as Eingang, -- nur Einzahlungen des Kunden
       sum(iif(KontoArt = 'A', Zahlung, 0)) as Ausgang -- nur Auszahlungen des Kunden
from KASSENBUCH
where extract(year from datum) in (2016, 2017)
group by Kunde, Jahr

HPB 27. Jul 2016 18:12

AW: select sum mit feldausgabe
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1343605)
Was ist für den Anfang mit

SQL-Code:
SELECT SUM(Zahlung), KontoArt
WHERE (KontoArt = 'E') or (KontoArt = 'A')
GROUP BY KontoArt
Das sollte doch schon mal die beiden Summen ergeben.

Bleibt immer noch unklar, was mit den übrigen Feldern gemeint ist.

Die beiden Summen werden ausgegeben.
Delphi-Quellcode:
select
sum(Zahlung) as Gesamt, KontoArt
Es werden die beiden Summen unter dem Feldnamen "Gesamt" ausgegeben,
jeweils mit der Kontoart 'E oder A'.
Aber wie greife ich auf die einzelnen Summe zu um sie anzuzeigen?


Ich werde das ganze für einen Fast-Report gebrauchen.
Der Report wird in etwa so aufgebaut sein:
Gruppenkopf: AuszugsNr, Beginn und Ende als Datum, und die Summe für den Auszug (Einzahlungen - Ausgabe)
Im Detail: Datum, KontoNr, Kontoname, Buchungstext, Zahlung.

Mit Gruß HPB

p80286 27. Jul 2016 18:20

AW: select sum mit feldausgabe
 
Falls in Kontoart nur 'A' oder 'E' steht reicht ein einfaches
Code:
SELECT SUM(Zahlung), KontoArt
GROUP BY KontoArt
Da ich mit
SQL-Code:
or
nixcht soo gute Erfahrungen gemacht habe schlage ich vor
[CODE=SQL]
Code:
SELECT SUM(Zahlung), KontoArt
where Kontoart='A'
GROUP BY KontoArt
Union
SELECT SUM(Zahlung), KontoArt
where Kontoart='E'
GROUP BY KontoArt
order by KontoArt
SQL-Code:
select
  sum(Zahlung) as Einnahme,
  sum(Zahlung) as Ausgabe,
  (select SUM(Einnahme) where KontoArt = 'E') as Ges_Einnahmen,
  (select SUM(Ausgabe= where KontoArt = 'A') as Ges_Ausgabe


 from KASSENBUCH
 where extract(year from datum) in (2016, 2016)
Gibt es die Felder "Einnahme" und "Ausgabe" in der Tabelle "Kassenbuch"?
Wenn ich mich richtig erinnere, nein!
Also versuch es mal mit
Code:
(select SUM(Zahlung) where KontoArt = 'E') as Ges_Einnahmen,
und wie schon weiter oben angemerkt
Code:
  sum(Zahlung) as Einnahme,
  sum(Zahlung) as Ausgabe,
wird in Einnahme und Ausgabe den selben Wert liefern.



Gruß
K-H

Aviator 27. Jul 2016 18:25

AW: select sum mit feldausgabe
 
Zitat:

Zitat von HPB (Beitrag 1343603)
SQL-Code:
select
 sum(Zahlung) as Einnahme,
 sum(Zahlung) as Ausgabe,
 (select SUM(Einnahme) where KontoArt = 'E') as Ges_Einnahmen,
 (select SUM(Ausgabe= where KontoArt = 'A') as Ges_Ausgabe --    <=== HIER IST DER FEHLER


from KASSENBUCH
where extract(year from datum) in (2016, 2016)
Bekomme beim Testen die Fehlermeldung: "Token unknow - line 4, column 23 - Where"
Der obige Code scheint zu funktionieren. Warum ich beim unteren Code
eine Fehlermeldung bekomme kann ich nicht nachvollziehen.
Mit Gruß HPB

Schau mal, da ist vor dem
SQL-Code:
WHERE KontoArt = 'A'
ein "=" Zeichen reingerutsch anstatt eine schließene Klammer ")". Ob das jetzt zum gewünschten Ergebnis führt kann ich nicht sagen, aber die Fehlermeldung sollte verschwinden.

HPB 27. Jul 2016 18:35

AW: select sum mit feldausgabe
 
Zitat:

Zitat von Aviator (Beitrag 1343614)
Zitat:

Zitat von HPB (Beitrag 1343603)
SQL-Code:
select
 sum(Zahlung) as Einnahme,
 sum(Zahlung) as Ausgabe,
 (select SUM(Einnahme) where KontoArt = 'E') as Ges_Einnahmen,
 (select SUM(Ausgabe= where KontoArt = 'A') as Ges_Ausgabe --    <=== HIER IST DER FEHLER


from KASSENBUCH
where extract(year from datum) in (2016, 2016)
Bekomme beim Testen die Fehlermeldung: "Token unknow - line 4, column 23 - Where"
Der obige Code scheint zu funktionieren. Warum ich beim unteren Code
eine Fehlermeldung bekomme kann ich nicht nachvollziehen.
Mit Gruß HPB

Schau mal, da ist vor dem
SQL-Code:
WHERE KontoArt = 'A'
ein "=" Zeichen reingerutsch anstatt eine schließene Klammer ")". Ob das jetzt zum gewünschten Ergebnis führt kann ich nicht sagen, aber die Fehlermeldung sollte verschwinden.

Danke für Deine Aufmerksamkeit.
Die schliessende Klammer fehlt in der Tat. Aber der Fehler tritt ja schon in der Zeile 4 beim "Where" auf.
Mit Gruß HPB

himitsu 28. Jul 2016 11:11

AW: select sum mit feldausgabe
 
Zitat:

SQL-Code:
(select SUM(Einnahme) where KontoArt = 'E') as Ges_Einnahmen,

Und von was soll bei
SQL-Code:
select SUM(Einnahme) where KontoArt = 'E'
das SUM angezeigt werden?

Da fehlt mindestens noch ein FROM dazwischen.


Zitat:

Aber wie greife ich auf die einzelnen Summe zu um sie anzuzeigen?
Ich klinke mich hier aus.
Nochmal will ich mich nicht wiederholen.

himitsu 28. Jul 2016 11:13

AW: select sum mit feldausgabe
 
[del] blöder Doppelpost

rokli 28. Jul 2016 11:45

AW: select sum mit feldausgabe
 
Moin!

Delphi-Quellcode:
sum(Zahlung) as Umsatz, -- alles zusammen
das ist aber leider falsch; wenn er zwei Arten von Buchungen hat, nämlich EIN- und AUS- Zahlungen, dann wirds nur richtig, wenn die Werte in den Buchungssätzen mit Vorzeichen versehen werden!

Wenn die Werte berechnet werden, wie Uwe Raabe es vorgegeben hat, dann kann man anschließend noch saldieren ...

Gruß Rolf

himitsu 28. Jul 2016 12:53

AW: select sum mit feldausgabe
 
Zitat:

Zitat von rokli (Beitrag 1343653)
das ist aber leider falsch; wenn er zwei Arten von Buchungen hat, nämlich EIN- und AUS- Zahlungen, dann wirds nur richtig, wenn die Werte in den Buchungssätzen mit Vorzeichen versehen werden!

Wurde dazu schon irgendwas gesagt? (kann mich nicht erinnern)

Aber auch da kann man die SUM für "Einzahlungen" und "Ausgabe" getrennt summieren und dann verrechnen (Einzahlungen-Ausgabe).
Und wenn die "Ausgaben" negativ sind, dann halt Einzahlungen+Ausgabe , bzw. man kann das dann problemlos mit einem SUM gemeinsam zusammenrechnen lassen.

rokli 28. Jul 2016 13:03

AW: select sum mit feldausgabe
 
@himitsu: Na klar, weil SUM ja nun mal "zusammenrechnet" :-D

ich würde es vielleicht so machen: (Edit: 3. SUM: dabei darf es aber nur diese beiden Kontenarten geben!)

Delphi-Quellcode:
SELECT
   SUM(CASE WHEN Kontoart = 'E' THEN Zahlung ELSE 0 END) AS Gesamt_Ein,
   SUM(CASE WHEN Kontoart = 'A' THEN Zahlung ELSE 0 END) AS Gesamt_Aus,
   SUM(CASE WHEN Kontoart = 'E' THEN Zahlung ELSE Zahlung * -1 END) AS Gesamt   
FROM
   Kassenbuch
wobei ich nicht weiss, ob diese Syntax von Interbase unterstützt wird.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:45 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 by Thomas Breitkreuz