AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Firebird SQL Abfrage Berechnung
Thema durchsuchen
Ansicht
Themen-Optionen

Firebird SQL Abfrage Berechnung

Ein Thema von pbfdg · begonnen am 18. Mär 2006 · letzter Beitrag vom 19. Mär 2006
Antwort Antwort
pbfdg

Registriert seit: 13. Mär 2005
16 Beiträge
 
#1

Firebird SQL Abfrage Berechnung

  Alt 18. Mär 2006, 12:53
Datenbank: Firebird • Version: 2.0 Beta • Zugriff über: ZEOS 6.1.5
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
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#2

Re: Firebird SQL Abfrage Berechnung

  Alt 18. Mär 2006, 16:43
SQL-Code:
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
für jede Gruppe zu ändern.

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
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
pbfdg

Registriert seit: 13. Mär 2005
16 Beiträge
 
#3

Re: Firebird SQL Abfrage Berechnung

  Alt 18. Mär 2006, 18:02
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.
Miniaturansicht angehängter Grafiken
kalkul1_116.jpg   kalkul0_141.jpg  
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Firebird SQL Abfrage Berechnung

  Alt 18. Mär 2006, 18:08
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:
T1
ID | Gruppe | Wert
 1 |      1 | 1250 
 1 |      2 |  325 
 1 |      3 |  112
 2 |      1 |  850 
 2 |      2 |  175
 2 |      3 |   86
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.

Grüße vom marabu
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#5

Re: Firebird SQL Abfrage Berechnung

  Alt 18. Mär 2006, 19:53
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.
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
pbfdg

Registriert seit: 13. Mär 2005
16 Beiträge
 
#6

Re: Firebird SQL Abfrage Berechnung

  Alt 19. Mär 2006, 16:57
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
Angehängte Dateien
Dateityp: zip daten_151.zip (88,4 KB, 6x aufgerufen)
Dateityp: zip delphi-praxis-forum_513.zip (1,18 MB, 8x aufgerufen)
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#7

Re: Firebird SQL Abfrage Berechnung

  Alt 19. Mär 2006, 21:14
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? )

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
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
pbfdg

Registriert seit: 13. Mär 2005
16 Beiträge
 
#8

Re: Firebird SQL Abfrage Berechnung

  Alt 19. Mär 2006, 22:01
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:04 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