Delphi-PRAXiS
Seite 1 von 2  1 2   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi kombination von Select count(*), ID,... und Abfrage (https://www.delphipraxis.net/42315-kombination-von-select-count-%2A-id-und-abfrage.html)

Albi 17. Mär 2005 07:45

Datenbank: Interbase • Version: 7.1 • Zugriff über: IBX

kombination von Select count(*), ID,... und Abfrage
 
Hallo,

über eine StoredProc suche ich Daten in meiner DB. Hier habe ich bis jetzt immer 2 Abfragen gestartet, 1 für das Count und die anderen um die Daten zu holen.

Nun meine Frage, ist es möglich, dies nicht in einer Select zu kombinieren? Ich habe das hier ja schon gesehen aber ich bin wahrschein,lich zu b... dazu. Ich bekomme immer nur eine nette Exception

Zitat:

fmCompile.quCompile:
Invalid token.Dynamic SQL Error.
SQL error code = -104.
invalid column reference.
Wenn ich die Procedure so

SQL-Code:
Create Procedure ....
...
Returns (
  ID Integer,
  Name VARCHAR (30),
  Count Integer)
AS
Begin
  Select Count(ID) AS Count, Name AS Name, ... From DB WHERE ID = :iID
  Into :Count,
       :ID,
       :Name
suspend;
end
aufbaue sollte das doch gehen oder liege ich da so falsch? :gruebel:

Stevie 17. Mär 2005 08:03

Re: kombination von Select count(*), ID,... und Abfrage
 
Das geht so nicht!
Count ist eine Group-Funktion, und somit kannst du bei einer Gruppierung nicht auf andere Felder zugreifen...
Zu Erklärung:
Nehmen wir an, es gibt 3 Sätze in der Tabelle, die die gesuchte ID haben:

Code:
ID  Name
1    A
1    B
1    C
Du zählst jetzt die Sätze, das liefert einen Satz zurück, ID wäre noch möglich, wenn du ein group by id an deine Abfrage hängen würdest, aber welcher Namen soll denn genommen werden?? Wenn du allerdings überall den gleichen Namen drinstehen hast, dann kannst du an dein group by noch ein ,name anhängen...

Ich vermute aber, dass ID in deiner Tabelle eine Referenz auf einer andere Tabelle ist, wo ID der Primärschlüssel ist.
Dann wäre es redundant, den Namen in der Tabelle zu speichern, wo der Verweis steht.

Der INTO-Teil kommt übrigens vor das FROM...

MfG
Stevie

Lord_Stifterl 17. Mär 2005 08:05

Re: kombination von Select count(*), ID,... und Abfrage
 
Hmm...sollte eigentlich funktionieren. Hab selbst in manchen Procedures eine Statement welches so ähnlich aufgebaut ist. Scheint aber klar zu sein warums nicht funkt:

Du baust dein Select so auf:

SQL-Code:
Select Count(ID) AS Count, Name AS Name, ...
und versucht es dann so zuzuweisen:

SQL-Code:
  Into :Count, :ID, :Name
Du versuchst also das Feld "NAME" der Variable "ID" zuzuweisen. Kann ja nicht gehen, oder?

LG

EDIT:

Wusste gar nicht das man reservierte Wörter als Variablenbezeichnung verwenden darf (COUNT)

Stevie 17. Mär 2005 08:12

Re: kombination von Select count(*), ID,... und Abfrage
 
Zitat:

Zitat von Lord_Stifterl
Wusste gar nicht das man reservierte Wörter als Variablenbezeichnung verwenden darf (COUNT)

Darf man auch nicht, noch ein Fehler... :zwinker:

Lord_Stifterl 17. Mär 2005 08:16

Re: kombination von Select count(*), ID,... und Abfrage
 
Zitat:

Darf man auch nicht, noch ein Fehler...
Wusste ichs doch :-D

Albi 17. Mär 2005 08:30

Re: kombination von Select count(*), ID,... und Abfrage
 
Moin,

@Stevie: Wenn ich dich richtig verstanden habe geht das nicht aber ich das schon gesehen.

Zitat:

Zitat von Stevie
Der INTO-Teil kommt übrigens vor das FROM...

Bist Du dir da ganz sicher?

@Lord_Stifterl: Daran liegt es nicht, ich habe das nur falsch geschrieben. Kannst Du mir vielleicht zeigen wie das bei dir aussieht.

So hier mal der gesamte Code, der Fehler wegen. :-D

SQL-Code:
CREATE PROCEDURE PROC_SEARCH_STAMM (
    ITAG INTEGER,
    IS_NAME VARCHAR (30) CHARACTER SET ISO8859_1,
    IS_FIRMA VARCHAR (30) CHARACTER SET ISO8859_1,
    ISDXNAME VARCHAR (30) CHARACTER SET ISO8859_1,
    ISDXFIRMA VARCHAR (30) CHARACTER SET ISO8859_1)
RETURNS (
    OCOUNT INTEGER,
    OID INTEGER,
    OFULL_NAME VARCHAR (60) CHARACTER SET ISO8859_1,
    OFIRMA VARCHAR (100) CHARACTER SET ISO8859_1,
    OSTRASSE VARCHAR (100) CHARACTER SET ISO8859_1,
    OFULL_ORT VARCHAR (100) CHARACTER SET ISO8859_1)
AS
begin
  if (iTag = 1) then
  Begin
    /*Select Count(*) From db_stammdaten WHERE (Name Like :iS_Name) or (Firma Like :iS_Firma)
    Into :oCount;*/

    for select Count(St.Vorname) AS oCount,
               St.ID AS oID,
               St.Vorname ||' '||St.Name AS oFull_Name,
               St.Firma AS oFirma,
               St.Strasse AS oStrasse,
               P.Plz||' '||P.Ort AS oFull_Ort
         
        From db_stammdaten St
        Left Join db_plzort P ON (St.PlzOrtID = P.ID)
        Where (St.Name Like :iS_Name) or (St.Firma Like :iS_Firma)
        Group By Name
        Into :oCount,
             :oID,
             :oFull_Name,
             :oFirma,
             :oStrasse,
             :oFull_Ort
    do
  suspend;
  end
end
Wenn ich das Count und Group By herausnehme läuft der Code.

Danke

Lord_Stifterl 17. Mär 2005 08:36

Re: kombination von Select count(*), ID,... und Abfrage
 
Bei mir sieht das Statement in der StoredProcedure so aus:

SQL-Code:
        SELECT COUNT(ANMELDUNGSID), SUM(BETRAG)
        FROM TANMELDUNGEN
        WHERE ZAHLUNGSARTID = :iZahlungsartID
        AND BEZAHLT = 'T'
        AND STORNO = 'F'
        AND ZAHLUNGSDATUM = :DATUM
        AND ANLAGEVON = :USERID
        INTO :iAnzahl, :nSumme;

Stevie 17. Mär 2005 08:41

Re: kombination von Select count(*), ID,... und Abfrage
 
Zitat:

Zitat von Albi
Moin,

@Stevie: Wenn ich dich richtig verstanden habe geht das nicht aber ich das schon gesehen.

Zitat:

Zitat von Stevie
Der INTO-Teil kommt übrigens vor das FROM...

Bist Du dir da ganz sicher?

Ach, Mist, bei Oracle ist das so! :wall:

Lord_Stifterl 17. Mär 2005 08:50

Re: kombination von Select count(*), ID,... und Abfrage
 
Ich bin mir jetzt nicht 100%ig sicher aber ich glaub da gibts eventuell troubles mit den ALIASES und den VARIABLEN.

SQL-Code:
   
        for select Count(St.Vorname) AS oCount,
               St.ID AS oID,
               St.Vorname ||' '||St.Name AS oFull_Name,
               St.Firma AS oFirma,
               St.Strasse AS oStrasse,
               P.Plz||' '||P.Ort AS oFull_Ort
         
        From db_stammdaten St
        Left Join db_plzort P ON (St.PlzOrtID = P.ID)
        Where (St.Name Like :iS_Name) or (St.Firma Like :iS_Firma)
        Group By Name
        Into :oCount,
             :oID,
             :oFull_Name,
             :oFirma,
             :oStrasse,
             :oFull_Ort
Deine RETURN-Variablen haben den gleichen Namen wie deine Aliases. Vielleicht liegt hier irgendwo das Prob.

LG

Albi 17. Mär 2005 08:56

Re: kombination von Select count(*), ID,... und Abfrage
 
So, da dass ja so nicht zu gehen scheint. Hier mal der Grund für die Versuche.

Ich habe 2 Tabelle (aus den die Daten kommen). 1 mit Stammdaten und die 2te mit Partnern. Zu jeder Stammdate kann es ja nun beliebig viele Partner geben, also wollte ich nun, wenn ich in den Stammdate suche gleich noch mit rausbekommen wieviele Partner hierzu vorhanden sind.

Die Tabelle sind über die ID der Stammdate-DB miteinander verbunden.

Ich habe mir das so vorgestellt, dass man suchen kann (logisch) und in dem Suchergebnis der Stammdate soll dann gleich noch die Anzahl der Partner angezeigt werden.

Muster:
ID Name ... ... Anzahl Partner
1 Meier ... ... 1
2 Müller ... ... 2
usw.

Wenn das irgendwie gehen würde, wäre das echt super.

Wenn ich nun eine Abfrage starte, in der ich alle Stammdaten und die SID's (ID der Stdaten) der Partner hole, müßte man doch über Group by St.ID (Stammdaten) die Daten zusammenfassen können, oder? Versteh ich das Group by falsch. :wall: :wall: :wall:


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:50 Uhr.
Seite 1 von 2  1 2   

Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf