![]() |
Datenbank: Firebird • Version: 2.0 Beta • Zugriff über: ZEOS 6.1.5
Firebird SQL Abfrage Berechnung
Hallo zusammen,
ich habe 2 Tabellen, in der Ersten Tabelle werden verschiedene werte abgelegt. ID | Gruppe1 | Gruppe2 | Gruppe3 1 | 1250 | 325 | 112 2 | 850 | 175 | 86 In der Zweiten Tabelle werden nun teilwerte abgelegt. ID | TABELLE1_ID | GRUPPE | TEILWERT 1 | 1 | Gruppe1 | 17 2 | 1 | Gruppe1 | 20 3 | 1 | Gruppe2 | 10 4 | 1 | Gruppe3 | 15 5 | 1 | Gruppe2 | 10 Nun möchte ich über eine SQL-Abfrage folgendes erreichen. Die Werte aus der zweiten Tabelle Gruppieren und die Summe bilden und dann noch den RESTWERT anzeigen der sich aus Wert Tabelle1(Gruppe1) minus Summe Tabelle2(Gruppierung Gruppe1) ergibt. GRUPPE | SUM_TEILWERT | RESTWERT Gruppe1 | 37 | 1213 Gruppe2 | 20 | 305 Gruppe3 | 15 | 71 Diese SQL-Abfragen habe ich schon Tabelle2: select GRUPPE, sum(TEILWERT) as SUM_TEILWERT from TABELLE1 where (TABELLE1_ID = :ID) group by GRUPPE Wer kann mir weiterhelfen???????????????? Gruss Peter |
Re: Firebird SQL Abfrage Berechnung
SQL-Code:
für jede Gruppe zu ändern.
select T1.GRUPPE1, sum(T2.TEILWERT) as SUM_TEILWERT, T1.GRUPPE1 - sum(T2.TEILWERT) from TABELLE1 T1
inner join TABELLE2 T2 on (T2.TABELLE1_ID = T1.ID) where T2.GRUPPE = 1 group by T1.Gruppe1 Eigentlich ist da ein Fehler in Deinem DB-Design, wie ich meine. Wenn Ich nachher Zeit habe schaue ich mal drauf. Ansonsten kannst Du das Ergebnis nur mit einer SP erreichen:
SQL-Code:
CREATE PROCEDURE NEW_PROCEDURE
RETURNS ( GRUPPE VARCHAR(10), TEILWERT BIGINT, RESTWERT BIGINT) AS BEGIN GRUPPE = 'Gruppe 1'; select sum(T2.TEILWERT) as SUM_TEILWERT, T1.GRUPPE1 - sum(T2.TEILWERT) from TABELLE1 T1 inner join TABELLE2 T2 on (T2.TABELLE1_ID = T1.ID) where T2.GRUPPE = 1 group by T1.Gruppe1 INTO :TEILWERT, :RESTWERT; SUSPEND; GRUPPE = 'Gruppe 2'; select sum(T2.TEILWERT) as SUM_TEILWERT, T1.GRUPPE2 - sum(T2.TEILWERT) from TABELLE1 T1 inner join TABELLE2 T2 on (T2.TABELLE1_ID = T1.ID) where T2.GRUPPE = 2 group by T1.Gruppe2 INTO :TEILWERT, :RESTWERT; SUSPEND; GRUPPE = 'Gruppe 3'; select sum(T2.TEILWERT) as SUM_TEILWERT, T1.GRUPPE3 - sum(T2.TEILWERT) from TABELLE1 T1 inner join TABELLE2 T2 on (T2.TABELLE1_ID = T1.ID) where T2.GRUPPE = 3 group by T1.Gruppe3 INTO :TEILWERT, :RESTWERT; SUSPEND; END |
Re: Firebird SQL Abfrage Berechnung
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo webcss,
hier ein paar Bilder zum verdeutlichen meines problems. Die Tabellen gehören zu einer Kalkulationssoftware an der ich momentan arbeite. Tabelle1 ist die "Kalkulation". In Tabelle2 werden die Arbeitsstunde verbucht. Mit dem Feld "V_BETRAG" habe ich versucht gleich bei der eingabe der Arbeitsstunden die Berechnung durchzuführen , dies funktioniert auch. Bei der Summenbildung habe ich dann im Query min(V_Betrag) as REST abgefragt. Das ganze hat aber einen Haken. Lösche oder änder ich einen Datensatz in Tabelle2 stimmt meine ganze Berechnung nicht mehr. Ich hoffe es gibt eine lösung für mein problem. Gruss Peter Kalkul0.jpg zeigt die Tabelle1 von der die werte abgezogen werden sollen. (immer nur ein Datensatz) Kalkul1.jpg zeigt die Tabelle(links) indem die teilwerte eingegeben werden. Rechts ist die Query mit der Summenbildung. |
Re: Firebird SQL Abfrage Berechnung
Hallo Peter,
du machst dir das Leben leichter, wenn du deine Tabellen aufeinander abstimmst. Wenn 'Gruppe1' in T2 ein Spaltenwert ist, dann sollte es auch in T1 ein Spaltenwert sein - und nicht ein Spaltenname. Im Beispiel habe ich nur eine Gruppennummer vergeben - eventuell auch für dich eine Überlegung wert.
Code:
Eine geeignete Selektion auf jeweils T1 und T2, die Bildung einer Vereinigungsmenge und die Summen-Aggregierung über ID und GRUPPE sollte dann das gewünschte Ergebnis bringen.
T1
ID | Gruppe | Wert 1 | 1 | 1250 1 | 2 | 325 1 | 3 | 112 2 | 1 | 850 2 | 2 | 175 2 | 3 | 86 Grüße vom marabu |
Re: Firebird SQL Abfrage Berechnung
Hi Peter!
Ich kann dem marabu nur zustimmen: Du solltest Deine Tabellen aufeinander abstimmen. Grundsätzlich solltest Du berechnete Felder immer - wenn überhaupt als Tabellenfeld - über Trigger neu berechnen (ON INSERT, ON DELETE, ON UPDATE). Besser ist s jedoch, jeweils bei einer Abfrage die Felder zu berechnen. Du solltest Dir wirklich nochmal das Design Deiner DB anschauen und entsprechende Normalisierungsregeln einarbeiten. Wenn es Dir möglich ist, poste einfach mal Deine DB mit einigen Demodaten, dann ist es wesentlich einfacher Dir die richtigen Tips zu geben. |
Re: Firebird SQL Abfrage Berechnung
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo webcss,
habe mal zwei Dateien in den Anhang gepackt! Die Datei Delphi-Praxis-Forum.zip beinhaltet eine AVI-Datei in der meine Applikation in aktion zu sehen ist. Die DATEN.FDB ist meine dazugehörige Datenbank. Gruss Peter |
Re: Firebird SQL Abfrage Berechnung
Hi Peter,
also: als erstes empfehle ich Dir die Firebird 2 beta nicht als Produktivsystem zu nutzen. Kann eventuell mal in die Hose gehen. Wenn ich das richtig überblicke stellt ihr werkzeuge her, dafür fallen in zwar immer diesselben, aber nicht immer alle Arbeitsschritte an, richtig? Du solltest also deine Tabelle Vorkalkulation entsprechend normalisieren (derzeit sind das einfach zu viele felder, was machst du wenn sich Arbeitsschritte ändern, wegfallen oder neue hinzukommen? :wink: ) Neue tabelle: Arbeitsschritt - ID - Bezeichnung - Stundensatz Tabelle Vorkalkulation entsprechend ändern: - ID - Werkzeug_Ref - Land - Änderungskalkulation - Vollkosten Tabelle VorkalSchritte - ID - Vorkalkulation_Ref - Arbeitsschritt_Ref - Zeit - Betrag Für Deine query bemühst Du dann entweder ne select-procedure oder erstellst ein view, welche Du dann parametrisiert abfragst. Dann gibt's auch keine probleme mehr mit geänderten oder gelöschten Daten. Das ist jetzt erstmal eine vorabeinschätzung, vielleicht hilft eine Systembeschreibung um etwas mehr zu sagen. Aber das obige fällt sofort auf. Gruß, webcss |
Re: Firebird SQL Abfrage Berechnung
Hallo webcss,
auf die Idee bin ich nicht gekommen. Werde es gleich mal versuchen die Tabellen in der Richtung umszustellen. Wenn es in diesem Forum Unit's zu für "SUPER Hilfe" geben würde, wären dir 1000 sicher. (aus einem CAD Forum) Danke!!!! Gruss Peter |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 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