![]() |
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:
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.
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; |
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 |
Re: Problem mit stored Procedure und group by
Hallo Hanso,
probiere es mal so:
SQL-Code:
evt hilft es auch wenn Du anstatt SUM(K.MENGE) lieber SUM(K.MENGE) AS Feldname schreibst.
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; Feldname sollte dabei dem Ziel Feld in der Tabelle MONATSMENGE entsprechen. |
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) |
Re: Problem mit stored Procedure und group by
Muss das nicht so aussehen?
SQL-Code:
Bei ORACLE muss das INTO zumindest immer nach dem Select kommen.
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; Gruß Daniel |
Re: Problem mit stored Procedure und group by
Zitat:
Bei IB/FB kommt das Into hinter WHERE/ORDER BY clause aber vor die Gruppierung (solange ich es richtig in Erinnerung habe). |
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)
|
Re: Problem mit stored Procedure und group by
Hallo Hansa,
kann MONATSMENGE 2 Werte aufnehmen??? |
Re: Problem mit stored Procedure und group by
Hansa, so wird das nie was.
Zitat:
Grüße vom marabu |
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:
Hier sind die Felder MONAT & JAHR nicht eindeutig, da kein Tabellenname angegeben. Daher:
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)
SQL-Code:
Wenn in der Feldliste dann neben der Aggregat-Funktion ein (oder mehrere) "normales" Feld(er) auftaucht, dann muss diese Feld hinter GROUP BY stehen!!
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)
SQL-Code:
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.
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 Du kannst auch die Daten mit einer Unterabfrage aufbereiten. Zuerst die innere SELECT - Abfrage:
SQL-Code:
Diese Unterabfrage lässt sich nun mit der Tabelle ART verjoinen:
(SELECT ID_ART, SUM(MENGE) as SUMMENGE FROM KSTAT
WHERE (MONAT >= :VONMONAT) AND (MONAT <= :BISMONAT) AND (JAHR = :JAHR) GROUP BY ID_ART)
SQL-Code:
Die Tabelle DevTbl ist der Alias für die Unterabfrage.
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 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 22:12 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