AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Wie gruppiert summieren in Abhängikeit von einem Feld?
Thema durchsuchen
Ansicht
Themen-Optionen

Wie gruppiert summieren in Abhängikeit von einem Feld?

Ein Thema von BlueStarHH · begonnen am 16. Jul 2016 · letzter Beitrag vom 17. Jul 2016
Antwort Antwort
Seite 2 von 2     12   
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hamburg
849 Beiträge
 
Delphi 11 Alexandria
 
#11

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?

  Alt 16. Jul 2016, 22:23
Danke, nun läuft es Mit nur einer Tabelle sieht es so aus:

Code:
select id, sum( haben ) - sum( soll ) as saldo
from
 (
  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

group by id
Welcher Code ist nun schneller? Der hier von Sir Rufo oder der von jobo?
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#12

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?

  Alt 16. Jul 2016, 22:46
Wenn wir jetzt bei Wer Wird Millionär? wären, würde ich den Telefonjoker nehmen und Dich anrufen:
Du hast beide Abfragen und alle Daten, wer könnte es besser wissen?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#13

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?

  Alt 17. Jul 2016, 00:01
Welcher Code ist nun schneller? Der hier von Sir Rufo oder der von jobo?
Das kommt zu 50% auf Deine Konfiguration der Datenbank an.
Die Frage ist eher ob Du Id,Betrag oder Id,Soll,Haben benötigst.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#14

AW: Wie gruppiert summieren in Abhängikeit von einem Feld?

  Alt 17. Jul 2016, 09:34
Dazu kommt noch die Datenmenge.
Am Ende basieren nun beide Selects auf einem Union, was sie vermutlich gleich schnell/langsam macht.
Es fallen 2 Full Table Scans an.

Was mir noch aufgefallen ist: Das Union ohne All ist kritisch.
Logisch gesehen muss es alle Datensätze inkludieren, müsste also "union all" sein. Die konkrete Select Clause verhindert hier zwar, dass tatsächlich Unique Werte zunächst entstehen und damit gleich wieder verschluckt werden, aber eine unglückliche Umformulierung des Selectteils reicht vielleicht und man verliert unbemerkt Werte.
Mit Union All ist alles easy und man erspart der DB noch die Unique Prüfung, gewinnt also Zeit.

Hier ist noch eine Variante, die dem ursprünglichen Vorschlag von SR etwas näher kommt, ohne Kontotabelle und ohne Union. Da also das plumpe Union fehlt, kann man sich Hoffungen machen, dass ein gezielter Zugriff auf einzelne ID oder kleine Untermengen sehr viel schneller ist, vorausgesetzt die ID Columns sind indiziert:
SQL-Code:
select coalesce(foo1.id, foo2.id) as id,
       --sum( haben ) - sum( soll ) as saldo
       sum(coalesce(foo1.betrag, 0)) - sum(coalesce(foo2. betrag, 0)) as saldo
  from (select id1 as id, betrag from buchung
       -- where id1 =2
       ) foo1
  full outer join
       (select id2 as id, betrag from buchung
       -- where id2 =2
       ) foo2
    on foo2.id = foo1.id
 group by coalesce(foo1.id, foo2.id)
P.S.:Ich merke gerade, dass eine Filterung (und Indexnutzung) natürlich auch im Union möglich ist. Hab ich mich selbst überlistet. (war ja auch noch früh)
Gruß, Jo

Geändert von jobo (17. Jul 2016 um 10:22 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 Uhr.
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