![]() |
SQL Problem mit Interbase
Hallo Leute,
für Oracle sieht meine Problemlösung so aus:
SQL-Code:
Dies liefert mir (steht oben im Select-Teil) die Anzahl der Felder, die den Wert 'T' haben.
SUM(TO_NUMBER(TRANSLATE(ANDERE,'FT','01')))
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:
Habt ihr eine Idee? Mir raucht hier langsam der Kopf :drunken:
SUM(CAST(ANDERE as Integer))
|
Re: SQL Problem mit Interbase
HY TouchDown!
Delphi-Quellcode:
Wenn ich Dich falsch verstanden haben sollte, vergiss alles was ich geschrieben habe:
Dies liefert mir (steht oben im Select-Teil) die Anzahl der Felder, die den Wert 'T' haben.
SQL-Code:
Gruss
Select Count(*) Cnt From WasWeissIch Where ANDERE = "T"
OLLI |
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'
|
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:
Es muss schon in einem Statement durchgeboxt werden, dieses SQL funktioniert unter Oracle super. Ich muss nur die dumme Sache mit dem 'TRANSLATE' umbiegen.
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 |
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 |
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. |
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: |
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:
Vielleicht kennt einer der Interbase-PROs hier eine Übersetzung zu Interbase.
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) Ich kenn mich auch nur mit Oracle aus. :roll: |
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. |
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:
Die KundenID übergibst Du an die StoPro, deren Kern dann etwa so aussehen sollte:
Select K.KUNDEID FROM KUNDEN K
WHERE (K.PBETREUER=-59 OR K.FBETREUER=-59 OR K.WBETREUER=-59)
SQL-Code:
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!
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 Hoffe Dir weitergeholfen zu haben und wünsche viel Erfolg Gruss OLLI |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:07 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-2025 by Thomas Breitkreuz