Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Problem mit stored Procedure und group by (https://www.delphipraxis.net/52378-problem-mit-stored-procedure-und-group.html)

Hansa 29. Aug 2005 10:19

Datenbank: FB 1.5 • Zugriff über: FIBplus

Problem mit stored Procedure und group by
 
Hi,

ich bin hier mit einer Statistik beschäftigt. Es sollen die Mengen eines Kunden über ein paar Monate addiert werden. Diese sollen zusammen mit anderen Informationen ausgegeben werden. Ich habe das jetzt mal so reduziert :

SQL-Code:
SELECT SUM(K.MENGE), A.NR
FROM ART A RIGHT JOIN KSTAT K ON (A.ID = K.ID_ART)
WHERE (MONAT >= :VONMONAT) AND (MONAT <= :BISMONAT) AND (JAHR = :JAHR)
INTO MONATSMENGE;
Das Problem ist das A.NR (für Artikelnummer). Es heißt, das wäre weder in einer aggregate function noch in einer group by clause vorhanden. SUM usw. brauche ich ja auch dafür nicht. Aber wo muß das GROUP BY genau hin ? Auf Dataset Ebene geht alles, aber in Delphi ist das komplette Statement fast eine DIN A 4 Seite. Ich will zumindest die Sachen, die nur die DB betreffen in die SP verlagern.

marabu 29. Aug 2005 10:41

Re: Problem mit stored Procedure und group by
 
Hallo Hansa,

laut SQL Reference gehört "GROUP BY A.Nr" hinter deine INTO-Klausel.

Grüße vom marabu

Jens Schumann 29. Aug 2005 10:43

Re: Problem mit stored Procedure und group by
 
Hallo Hanso,
probiere es mal so:
SQL-Code:
SELECT SUM(K.MENGE), A.NR
FROM ART A RIGHT JOIN KSTAT K ON (A.ID = K.ID_ART)
WHERE (MONAT >= :VONMONAT) AND (MONAT <= :BISMONAT) AND (JAHR = :JAHR) GROUP BY A.NR
INTO MONATSMENGE;
evt hilft es auch wenn Du anstatt SUM(K.MENGE) lieber SUM(K.MENGE) AS Feldname schreibst.
Feldname sollte dabei dem Ziel Feld in der Tabelle MONATSMENGE entsprechen.

Hansa 29. Aug 2005 11:03

Re: Problem mit stored Procedure und group by
 
hinter dem Into bringt : "Parsing error"

davor bringt : "count of column list and variable list do not match."

AS bringt auch keine Änderung.

@Jens : Monatsmenge ist keine Tabelle, sondern ein Rückgabewert ! Odder liegt es daran ? Ich befürchte langsam, daß das ganz anders gemacht werden muß. 8)

dfried 29. Aug 2005 11:23

Re: Problem mit stored Procedure und group by
 
Muss das nicht so aussehen?

SQL-Code:
SELECT SUM(K.MENGE), A.NR INTO MONATSMENGE
FROM ART A RIGHT JOIN KSTAT K ON (A.ID = K.ID_ART)
WHERE (MONAT >= :VONMONAT)
AND (MONAT <= :BISMONAT)
AND (JAHR = :JAHR)
GROUP BY A.NR;
Bei ORACLE muss das INTO zumindest immer nach dem Select kommen.

Gruß
Daniel

Robert_G 29. Aug 2005 11:43

Re: Problem mit stored Procedure und group by
 
Zitat:

Zitat von dfried
Bei ORACLE muss das INTO zumindest immer nach dem Select kommen.

Marabu hat es doch schon gelöst. ;)
Bei IB/FB kommt das Into hinter WHERE/ORDER BY clause aber vor die Gruppierung (solange ich es richtig in Erinnerung habe).

Hansa 29. Aug 2005 12:10

Re: Problem mit stored Procedure und group by
 
Er hat es nicht gelöst. Das war das erste, was ich vorher schon gemacht habe. Allerdings muß es laut SQL-Referenz davor, wie ens schreibt ! Ergebnis : siehe oben. 8)

Jens Schumann 29. Aug 2005 12:13

Re: Problem mit stored Procedure und group by
 
Hallo Hansa,
kann MONATSMENGE 2 Werte aufnehmen???

marabu 29. Aug 2005 12:35

Re: Problem mit stored Procedure und group by
 
Hansa, so wird das nie was.

Zitat:

SELECT [TRANSACTION transaction]
[DISTINCT | ALL]
{* | <val> [, <val> …]}
[INTO :var [, :var …]]
FROM <tableref> [, <tableref> …]
[WHERE <search_condition>]
[GROUP BY col [COLLATE collation] [, col [COLLATE collation] …]
[HAVING <search_condition>]
[UNION <select_expr> [ALL]]
[PLAN <plan_expr>]
[ORDER BY <order_list>]
[FOR UPDATE [OF col [, col …]]];
Schon dein erster Code in diesem thread macht kein singleton select. Ich hatte vorausgesetzt, dass dein Code wenigstens als Hypothese taugt.

Grüße vom marabu

shmia 29. Aug 2005 13:29

Re: Problem mit stored Procedure und group by
 
ALSO:
wenn du in einer SQL-Abfrage eine Aggregat-Funktion benützt (SUM, MIN, MAX, COUNT, AVG), dann werden mehrere Zeilen zusammengefasst.
SQL-Code:
SELECT SUM(K.MENGE)
FROM ART A RIGHT JOIN KSTAT K ON (A.ID = K.ID_ART)
WHERE (MONAT >= :VONMONAT) AND (MONAT <= :BISMONAT) AND (JAHR = :JAHR)
Hier sind die Felder MONAT & JAHR nicht eindeutig, da kein Tabellenname angegeben. Daher:
SQL-Code:
SELECT SUM(K.MENGE)
FROM ART A RIGHT JOIN KSTAT K ON (A.ID = K.ID_ART)
WHERE (K.MONAT >= :VONMONAT) AND (K.MONAT <= :BISMONAT) AND (K.JAHR = :JAHR)
Wenn in der Feldliste dann neben der Aggregat-Funktion ein (oder mehrere) "normales" Feld(er) auftaucht, dann muss diese Feld hinter GROUP BY stehen!!
SQL-Code:
SELECT SUM(K.MENGE), A.NR
FROM ART A RIGHT JOIN KSTAT K ON (A.ID = K.ID_ART)
WHERE (K.MONAT >= :VONMONAT) AND (K.MONAT <= :BISMONAT) AND (K.JAHR = :JAHR)
GROUP BY A.NR
Wenn du die Klausel SELECT ..... INTO new_table verwendest, dann gibt die Abfrage kein Ergebnis zurück, sondern die Ergebnismenge wird in eine neue physikalische Tabelle kopiert.

Du kannst auch die Daten mit einer Unterabfrage aufbereiten.
Zuerst die innere SELECT - Abfrage:
SQL-Code:
(SELECT ID_ART, SUM(MENGE) as SUMMENGE FROM KSTAT
WHERE (MONAT >= :VONMONAT) AND (MONAT <= :BISMONAT) AND (JAHR = :JAHR)
GROUP BY ID_ART)
Diese Unterabfrage lässt sich nun mit der Tabelle ART verjoinen:
SQL-Code:
SELECT A.*, DevTbl.SUMMENGE
FROM ART A RIGHT JOIN
   (SELECT ID_ART, SUM(MENGE) as SUMMENGE FROM KSTAT
   WHERE (MONAT >= :VONMONAT) AND (MONAT <= :BISMONAT) AND (JAHR = :JAHR)
   GROUP BY ID_ART) DevTbl
Die Tabelle DevTbl ist der Alias für die Unterabfrage.
Vorteil: du hast Zugriff auf alle Felder der Tabelle ART.
Es gibt also zwei Möglichkeiten:
* zuerst einen JOIN bilden and dann mit GROUP BY verdichten
* zuerst mit GROUP BY verdichten (die Unterabfrage) und dann den JOIN bilden

Ich hoffe, das bringt etwas Licht ins Dunkel :angel2:


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:57 Uhr.
Seite 1 von 3  1 23      

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