Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL AVG mit 2 Tabellen (https://www.delphipraxis.net/80237-sql-avg-mit-2-tabellen.html)

needatip 5. Nov 2006 14:55

Datenbank: Paradox • Version: 7 • Zugriff über: BDE

SQL AVG mit 2 Tabellen
 
Hallo
ich habe 2 Tabellen

1. Tabelle Rechnungen:
NR
Rech_Nr
Kunden_Nr

2. Tabelle Positionen:
NR
Rech_Nr
Pos_Nr
Preis

Nun möchte ich p. SQL-Befehl den durchschnittlichen Rechnungsbetrag aller Rechnungen ermitteln.
Also z.B.
1. Rechnung 20,--
2. Rechnung 40,--
3. Rechnung 60,--
4. Rechnung 100,--

Ergebnis: 55,--

Wie gehe ich vor ?

Mit
SQL-Code:
SELECT SUM(p.Preis)
 FROM Positionen p, Rechnungen r
WHERE p.Rech_Nr = r.Rech_Nr
bekomme ich die Summen der einzelnen Rechnungen.
Aber wie bekomme ich dann alle Summen der Rechnungen und davon dann den Mittelwert ?

Dax 5. Nov 2006 14:58

Re: SQL AVG mit 2 Tabellen
 
Ich denke mal mit
SQL-Code:
SELECT SUM(p.Preis) / COUNT(p.Preis)
FROM Positionen p, Rechnungen r
WHERE p.Rech_Nr = r.Rech_Nr

mkinzler 5. Nov 2006 15:00

Re: SQL AVG mit 2 Tabellen
 
Mit
SQL-Code:
SELECT SUM(p.Preis)
FROM Positionen p
bekommst du die Summe aller Rechnungen
Um die durchschnittliche Summe zu erhalten mußt du dieses durch die Anzahl der Rechnungen Teilen.

SQL-Code:
SELECT COUNT( RECHNR) from Positionen;

omata 5. Nov 2006 15:10

Re: SQL AVG mit 2 Tabellen
 
Kennt Paradox nicht AVG?

SQL-Code:
SELECT AVG(p.Preis)
FROM positionen p
INNER JOIN rechnungen r
  ON p.rech_nr = r.rech_nr
Gruss
Thorsten

needatip 5. Nov 2006 15:22

Re: SQL AVG mit 2 Tabellen
 
OK,
aber so bekomme ich den Durchschnittswert der Positionen.
Ich möchte aber den Durchsnittswert der Rechnungssummen ermitteln,
die sich nach SUM(Preis) ergeben.

Vielleicht hab ich mich auch nicht klar ausgedrückt oder hab ich hier einen Denkfehler?

mkinzler 5. Nov 2006 15:26

Re: SQL AVG mit 2 Tabellen
 
Entweder wie ich oben beschrieben oder
SQL-Code:
SELECT SUM(p.Preis) / Counr (p.Rechnr)
FROM Positionen p

needatip 5. Nov 2006 15:43

Re: SQL AVG mit 2 Tabellen
 
Rechnung1
30
20
30
1.Summe 80

Rechnung2
40
50
100
2.Summe 190

Rechnung3
40
30
20
3.Summe 90
Mittelwert der Rechnungssummen 120

Der SQL Befehl
SQL-Code:
SELECT SUM(p.Preis) / Counr (p.Rechnr)
FROM Positionen p
ergibt aber 40. (360/9) da 9 Positionen.
Ich möchte aber (Summe1 + Summe2 + Summe3 / 3) = 120.

mkinzler 5. Nov 2006 15:45

Re: SQL AVG mit 2 Tabellen
 
Dann mußt du es, wie in meinem ersten Post doch in 2 Schritten machen oder du verwendest eine temporäre Tabelle.

omata 5. Nov 2006 15:47

Re: SQL AVG mit 2 Tabellen
 
Sorry, das ich nochmal störe.
Aber genau das macht doch die Funktion AVG, deshalb die Frage ob es die in Paradox gibt.

Edit:
Ok, war gerade etwas auf dem Holzweg.
Neuer Versuch...
SQL-Code:
SELECT AVG(summen)
FROM (SELECT p.rech_nr, SUM(p.Preis) summen
      FROM positionen p
      INNER JOIN rechnungen r
        ON p.rech_nr = r.rech_nr
      GROUP BY p.rech_nr) x
Gruss
Thorsten

Meniskusschaden 5. Nov 2006 15:50

Re: SQL AVG mit 2 Tabellen
 
Ich weiss nicht, ob es mit Paradox funtioniert, aber versuche einmal folgendes:
SQL-Code:
select (avg(select sum(preis)
            from pos
            where rech.rech_nr = pos.rech_nr))
from rech

Meniskusschaden 5. Nov 2006 16:05

Re: SQL AVG mit 2 Tabellen
 
Hier ist noch eine Variante, die ohne Rechnungsdatei auskommt:
SQL-Code:
select avg(re_summe)                  
from (select sum(preis) re_summe      
      from Positionen                        
      group by rech_nr) p

needatip 5. Nov 2006 17:04

Re: SQL AVG mit 2 Tabellen
 
Das funktioniert nicht bei LOCAL SQL.
Hab gelesen dass, keine sog. Inline-Views in Paradox/BDE Abfragen möglich sind.
SELECT ...FROM(SELECT....

Jetzt muss ich halt 2 Select Abfragen machen.
Möchte sowieso dieses Programm später auf MS-SQL umstellen.

Trotzdem Danke !

marabu 5. Nov 2006 17:25

Re: SQL AVG mit 2 Tabellen
 
Hallo,

die BDE kennt sogenannte Local-SQL-Sichten, sowas ähnliches wie implizite Views. Zuerst muss das die View definierende SELECT Statement gespeichert werden:

SQL-Code:
/* RSUM.SQL */
SELECT RECHNR, SUM(PREIS) AS RECHSUM FROM RPOS GROUP BY RECHNR
Anschließend kann der Name der SQL-Datei als VIEW verwendet werden:

SQL-Code:
SELECT AVG(RECHSUM) FROM "RSUM.SQL"
Voila. Einer späteren Anpassung an DDL Views steht nichts im Wege.

Freundliche Grüße vom marabu

needatip 5. Nov 2006 17:41

Re: SQL AVG mit 2 Tabellen
 
Hab ich verstanden, aber wie speichert man das Select Statement ?
Ich muss doch den String einer Query übergeben und anschliessend
mit Open ausführen.

mkinzler 5. Nov 2006 17:45

Re: SQL AVG mit 2 Tabellen
 
Ja, und die BDE speichert dann das ergebnis in ihrem Arbeitsverzeichnis als Paradox-Tabelle zwischen. Das hatte ich mit temporärer Tabelle gemeint.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:17 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