![]() |
AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
Danke, nun läuft es :-) Mit nur einer Tabelle sieht es so aus:
Code:
Welcher Code ist nun schneller? Der hier von Sir Rufo oder der von jobo?
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 |
AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
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? ;) |
AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
Zitat:
Die Frage ist eher ob Du Id,Betrag oder Id,Soll,Haben benötigst. Gruß K-H |
AW: Wie gruppiert summieren in Abhängikeit von einem Feld?
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:
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)
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) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:56 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