Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi SQL Problem mit Interbase (https://www.delphipraxis.net/12078-sql-problem-mit-interbase.html)

Touchdown 20. Nov 2003 09:43


SQL Problem mit Interbase
 
Hallo Leute,

für Oracle sieht meine Problemlösung so aus:

SQL-Code:
SUM(TO_NUMBER(TRANSLATE(ANDERE,'FT','01')))
Dies liefert mir (steht oben im Select-Teil) die Anzahl der Felder, die den Wert 'T' haben.

Interbase kennt kein TO_NUMBER und auch kein TRANSLATE. TO_NUMBER kann ich mit einem CAST(... as Integer) gleichwertig ersetzen. Da aber in diesem Feld ein Char ist, bekomme ich natürlich einen 'Conversion error from string "T"'. Eigentlich muss ich nur noch ein 'T' konvertieren in eine '1', doch dies scheint ein echtes Problem zu sein.

Ich könnte ja auch immer eine '0' oder '1' speichern, ist aber keine echte Lösung für mich.

Nochmal kurz: Wie kann ich die Oracle-Funktion 'TRANSLATE' unter Interbase imitieren?

So weit bin ich ja schon :mrgreen:
SQL-Code:
SUM(CAST(ANDERE as Integer))
Habt ihr eine Idee? Mir raucht hier langsam der Kopf :drunken:

OLLI_T 20. Nov 2003 10:28

Re: SQL Problem mit Interbase
 
HY TouchDown!

Delphi-Quellcode:
Dies liefert mir (steht oben im Select-Teil) die Anzahl der Felder, die den Wert 'T' haben.
Wenn ich Dich falsch verstanden haben sollte, vergiss alles was ich geschrieben habe:

SQL-Code:
Select Count(*) Cnt From WasWeissIch Where ANDERE = "T"
Gruss

OLLI

MrSpock 20. Nov 2003 10:29

Re: SQL Problem mit Interbase
 
Hallo Touchdown,

wenn ich das richtig verstehe, ist es doch dasselbe wie:

SQL-Code:
SELECT COUNT(ANDERE) WHERE ANDERE='T'

Touchdown 20. Nov 2003 11:12

Re: SQL Problem mit Interbase
 
Sorry, muss wohl doch etwas mehr preisgeben :mrgreen:

Ihr hab natürlich Recht, allerdings ist die Sache nicht ganz so einfach :shock:

SQL-Code:
SELECT N.PRODUKTID,SUM(TO_NUMBER(TRANSLATE(N.BEDARF,'FT','01'))),
SUM(TO_NUMBER(TRANSLATE(N.OLB,'FT','01'))),
SUM(TO_NUMBER(TRANSLATE(N.ANDERE,'FT','01'))),
COUNT (N.ID)
FROM NUTZUNG N
,KUNDEN K
WHERE N.PRODUKTID IS NOT NULL AND
K.KUNDEID=N.KUNDEID AND
(K.PBETREUER=-59 OR K.FBETREUER=-59 OR K.WBETREUER=-59)
GROUP BY N.PRODUKTID
ORDER BY N.PRODUKTID
Es muss schon in einem Statement durchgeboxt werden, dieses SQL funktioniert unter Oracle super. Ich muss nur die dumme Sache mit dem 'TRANSLATE' umbiegen.

OLLI_T 20. Nov 2003 11:20

Re: SQL Problem mit Interbase
 
Hallo TouchDown!

Kommt als Alternative eine Stored Procedure für Dich in Betracht? Mit Hilfe einer Schleife über alle Datensätze Deiner SQL Abfrage iterieren und die relevanten Felder "von Hand" aufaddieren und als Result zurückgeben. Kann Dir leider keinen Code präsentieren, weil ich KZH bin. :?

Gruss

OLLI

Smokey 20. Nov 2003 11:28

Re: SQL Problem mit Interbase
 
ne andere alternative wäre noch wenn du dir 3 Views erstellst anstatt die SUM(..) Geschichte zu machen.
Dann kannst du statt SUM nen COUNT auf die entsprechende View machen.

Touchdown 20. Nov 2003 11:40

Re: SQL Problem mit Interbase
 
Ich denke ohne Stored Procedure werde ich hier auch keine Lösung mehr finden, allerdings habe ich überhaupt keine Erfahrung damit. Dieses Problem übersteigt ein wenig meine DB-Kenntnisse :hi:

Dieses Statement aufzuteilen ist auf jedenfalls kaum möglich, aber ich denke weiter darüber nach :roteyes:

Robert_G 20. Nov 2003 11:52

Re: SQL Problem mit Interbase
 
Um die Anzahl der Felder, die 'T' enthalten ohne Subquery zu bekommen kannst du auch CASE Statements benutzen. (Ist aber ziemlich langsam!)

SQL-Code:
SELECT N.PRODUKTID,
       SUM(CASE When N.BEDARF LIKE '%T%' Then 1 Else 0),
       SUM(CASE When N.OLB LIKE '%T%' Then 1 Else 0),
       SUM(CASE When N.ANDERE LIKE '%T%' Then 1 Else 0),
       COUNT(N.ID)
FROM  NUTZUNG N,
       KUNDEN K
WHERE N.PRODUKTID IS NOT NULL AND K.KUNDEID = N.KUNDEID AND
       (K.PBETREUER = -59 OR K.FBETREUER = -59 OR K.WBETREUER = -59)
GROUP BY N.PRODUKTID
ORDER BY N.PRODUKTID


DECODE wäre die andere Möglichkeit. z.B.:
SQL-Code:
SELECT N.PRODUKTID,
       SUM(decode(InSTR(N.BEDARF, 'T', 1), 0, 0, 1)),
       SUM(decode(InSTR(N.OLB, 'T', 1), 0, 0, 1)),
       SUM(decode(InSTR(N.ANDERE, 'T', 1), 0, 0, 1)),
       COUNT(N.ID)
Vielleicht kennt einer der Interbase-PROs hier eine Übersetzung zu Interbase.

Ich kenn mich auch nur mit Oracle aus. :roll:

Touchdown 20. Nov 2003 12:23

Re: SQL Problem mit Interbase
 
@GeorgeWNewbie

Interbase kennt viele Funktionen nicht, die in Oracle selbstverständlich sind.

Auf jeden Fall geht keine der beiden Vorschläge durch, aber ich danke dir für deine Mühe.

OLLI_T 20. Nov 2003 12:34

Re: SQL Problem mit Interbase
 
Hallo TouchDown!

Mist, da gibt es ein Problem mit der StoPro. Du kannst damit nur definierte Ergebnisse aber keine Datenmengen zurückbekommmen.

Du musst den SQL also in zwei Teile aufsplitten:

Ein IBSQL im Delphi-Programm liefert Dir zunächst die KundenID´s:

SQL-Code:
Select K.KUNDEID FROM KUNDEN K
WHERE (K.PBETREUER=-59 OR K.FBETREUER=-59 OR K.WBETREUER=-59)
Die KundenID übergibst Du an die StoPro, deren Kern dann etwa so aussehen sollte:

SQL-Code:
FOR Select PRODUKTID, BEDARF, OLB, ANDERE
FROM NUTZUNG
WHERE KUNDEID = :G_KUNDEID
INTO :V_PRODUKTID, :V_BEDARF, :V_OLB, :V_ANDERE
DO
BEGIN
  If (:V_PRODUKTID > 0) Then
  Begin
    If :V_BEDARF = "T" Then
       :R_Sum_Bedarf = :R_Sum_Bedarf + 1
    ...
  End
End
Das mag zwar nicht sehr elegant aussehen aber ich habe schon des öfteren festgestellt, dass Inner Joins viel schneller ausgeführt werden, wenn ich die in zwei Teile aufsplitte!

Hoffe Dir weitergeholfen zu haben und wünsche viel Erfolg

Gruss

OLLI


Alle Zeitangaben in WEZ +1. Es ist jetzt 17:26 Uhr.
Seite 1 von 2  1 2      

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