AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Problem mit stored Procedure und group by
Thema durchsuchen
Ansicht
Themen-Optionen

Problem mit stored Procedure und group by

Ein Thema von Hansa · begonnen am 29. Aug 2005 · letzter Beitrag vom 31. Aug 2005
Antwort Antwort
Seite 1 von 3  1 23      
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#1

Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 10:19
Datenbank: FB 1.5 • Zugriff über: FIBplus
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
marabu

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

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 10:41
Hallo Hansa,

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

Grüße vom marabu
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 10:43
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.
I come from outer space to save the human race
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 11:03
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)
Gruß
Hansa
  Mit Zitat antworten Zitat
dfried

Registriert seit: 16. Aug 2005
486 Beiträge
 
#5

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 11:23
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
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#6

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 11:43
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).
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#7

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 12:10
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)
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von Jens Schumann
Jens Schumann

Registriert seit: 27. Apr 2003
Ort: Bad Honnef
1.644 Beiträge
 
Delphi 2009 Professional
 
#8

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 12:13
Hallo Hansa,
kann MONATSMENGE 2 Werte aufnehmen???
I come from outer space to save the human race
  Mit Zitat antworten Zitat
marabu

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

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 12:35
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#10

Re: Problem mit stored Procedure und group by

  Alt 29. Aug 2005, 13:29
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
Andreas
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 16:36 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