Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Wie gruppiert summieren in Abhängikeit von einem Feld? (https://www.delphipraxis.net/189753-wie-gruppiert-summieren-abhaengikeit-von-einem-feld.html)

BlueStarHH 16. Jul 2016 17:37

Datenbank: Firebird • Version: 2.x • Zugriff über: IBDAC

Wie gruppiert summieren in Abhängikeit von einem Feld?
 
Hallo,

ich habe folgende Tabelle:

Code:
ID1  ID2   Betrag
 1    3       10
 1    2       30
 2    1      -50
Nun sollen die Beträge nach den IDs gruppiert summiert werden. Und zwar so: Wenn die ID in ID1 steht, wird der Betrag einfach aus dem Feld Betrag zur die Summe addiert. Wenn die ID hingegen in ID2 steht, soll der Betrag mit umgekehrten Vorzeichen zur Summe addiert werden.

Ergebnis:

Code:
ID Summe
1   90    (Rechenweg: 10 + 30 + 50)
2  -80    (Rechenweg: -30 - 50)
3  -10

Wie sieht dazu der SQL-Ausdruck aus?

Sir Rufo 16. Jul 2016 18:15

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
So ungefähr wäre eine Mölichkeit
SQL-Code:
select id, sum( haben ) - sum( soll ) as saldo
from (
select bar.id as id, foo1.betrag as haben, foo2.betrag as soll
from bar
left join ( select id1 as id, betrag from foo ) foo1 on foo1.id = bar.id
left join ( select id2 as id, betrag from foo ) foo2 on foo2.id = bar.id ) as foobar
group by id

BlueStarHH 16. Jul 2016 18:55

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
Danke, ich denke mal das "foo" der Name meiner vorhandenen Tabelle ist. Wenn ich dafür meinen vorhandenen Tabellennamen eintrage, kommt die Meldung "Table unknown BAR". Wie löse ich das?

Sir Rufo 16. Jul 2016 19:06

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
Hallo Herr Kollege,

da du keine Informationen zu den Namen deiner Tabellen angegeben hast, welche Namen hätte ich denn nehmen sollen?

Carl-Gustav-Günter-Seine-Frau-Ihre-Tabelle?

War mir aber zu lang zum tippen, also habe ich als Tabellennamen mal foo und bar gewählt. Du solltest deine Tabellen-Namen kennen. Wenn nicht, dann können wir dir gar nicht helfen.

BlueStarHH 16. Jul 2016 19:10

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
Es ist mir schon klar, warum Du das gemacht hast :-) Nur Du verwendest mehrere Platzhalter für mehrere Tabellennamen und ich habe aber nur eine Tabelle.

Wenn ich mir die Feldnamen anschaue ist foo mein Tabellenname (Betraege). "Bar" kann meine Tabelle (Betraege) nicht sein, denn z.B. "id" (Zeile 3 bar.id bei dir) gibt es dort nicht. In meiner Tabelle gibt es nur die Felder ID1 und ID2. Also was für "bar" eintragen?

jobo 16. Jul 2016 19:35

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
Ich schätze mal, wenn Du nur eine Tabelle hast, ist die Möglichkeit zur Umbenennung recht übersichtlich.
Ich vermute, es ging bei der Namenswahl von SR eher um Symbolik.

Alternativ:
SQL-Code:
select id1undid2, sum(betrag) from (
       select id1 as id1undid2, betrag from foo
         union all
       select id2, -1*betrag          from foo)
 group by id1undid2
Wenn Dein Statement eher mit großen Ergebnismengen verwendet wird, würde ich vielleicht eher meins nehmen, wenn es um bestimmte, feste ID geht eher das von SR. Kann aber auch eine schlechte Idee sein.

BlueStarHH 16. Jul 2016 19:50

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
Danke jobo, damit klappt es! Sir Rufos Code würde ich jedoch auch gerne austesten... Nur ich bekomme es einfach nicht hin, den zum laufen zu bekommen...

jobo 16. Jul 2016 20:24

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
Ok, Du weißt, was ein Tabellenname ist? Und was ein Alias ist? Du hast nur eine Tabelle?
Ich bin jetzt kein Online Parser und kann Dir keine Zeilen und Spaltennummern mit Korrektur liefern.
Du könntest Helfenden die Macht geben, indem Du konkrete Angaben zu den Problemen lieferst.

Ersetze alle Tabellennamen in dem Statement durch Deinen Tabellennamen.
Vieleicht gibt es noch irgendwo einen Tippfehler oder was auch immer, probier es aus.
Am Ende ist die Frage, ob Du das Statement von SR verstehst. Wenn ja, kannst Du es korrigieren, wenn es nicht gelingt, frag hier mit Angabe der notwendigen Daten (Dein Tabellenname, Feldnamen, ..)und des resultierenden Fehlers.

BlueStarHH 16. Jul 2016 20:49

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
OK, also ich versuche den Fehler nochmal genauer zu beschreiben:

Hier habe ich foo durch den Namen meiner Tabelle "Betraege" ersetzt (zur besseren Erkennung nur hier mit Unterstrichen eingefasst). Das führt zu dem Fehler der in Zeile 4 hier steht:

SQL-Code:
select id, sum( haben ) - sum( soll ) as saldo
from (
select bar.id as id, foo1.betrag as haben, foo2.betrag as soll
from bar       <----- Table unknown "bar"
left join ( select id1 as id, betrag from _Betraege_ ) foo1 on foo1.id = bar.id
left join ( select id2 as id, betrag from _Betraege_ ) foo2 on foo2.id = bar.id ) as foobar
group by id
Wenn ich nun auch bar in Zeile 4 durch meinen Tabellennamen "Betraege" gibt es die nächste Fehlermeldung:

SQL-Code:
select id, sum( haben ) - sum( soll ) as saldo
from (
select bar.id as id, foo1.betrag as haben, foo2.betrag as soll  
from _Betraege_
left join ( select id1 as id, betrag from _Betraege_ ) foo1 on foo1.id = bar.id <------ Column unkonwn bar.id
left join ( select id2 as id, betrag from _Betraege_ ) foo2 on foo2.id = bar.id ) as foobar
group by id
Jetzt kennt er bar.id nicht mehr, was ja auch nachvollziebar ist. Was also statt bar eintragen oder wo bar definieren? (Wenn dort auch mein Tabellenname eingetragen wird, läuft die Query endlos...)

Sir Rufo 16. Jul 2016 21:01

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
 
Obwohl ich gerade sehe, dass es bei meinem Statement zu doppelten Zählungen kommen kann.

Ein union ist da unverzichtbar.
SQL-Code:
select konto.id, sum( buch.haben ) - sum( buch.soll ) as saldo
from konto
left join (
  select id1 as id, betrag as haben, 0 as soll from buchung
  union
  select id2 as id, 0 as haben, betrag as soll from buchung ) as buch
  on buch.id = konto.id
group by konto.id
Hier mal ein SQLFiddle dazu


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:32 Uhr.
Seite 1 von 2  1 2      

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