AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi SQL Problem mit Interbase
Thema durchsuchen
Ansicht
Themen-Optionen

SQL Problem mit Interbase

Ein Thema von Touchdown · begonnen am 20. Nov 2003 · letzter Beitrag vom 20. Nov 2003
Antwort Antwort
Seite 1 von 2  1 2      
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#1

SQL Problem mit Interbase

  Alt 20. Nov 2003, 09:43
Hallo Leute,

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

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
SUM(CAST(ANDERE as Integer)) Habt ihr eine Idee? Mir raucht hier langsam der Kopf
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#2

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 10:28
HY TouchDown!

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:

Select Count(*) Cnt From WasWeissIch Where ANDERE = "T" Gruss

OLLI
No Pain No Gain!
  Mit Zitat antworten Zitat
Benutzerbild von MrSpock
MrSpock
(Co-Admin)

Registriert seit: 7. Jun 2002
Ort: Owingen
5.865 Beiträge
 
Delphi 2010 Professional
 
#3

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 10:29
Hallo Touchdown,

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

SELECT COUNT(ANDERE) WHERE ANDERE='T'
Albert
Live long and prosper


MrSpock
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#4

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 11:12
Sorry, muss wohl doch etwas mehr preisgeben

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

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.
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#5

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 11:20
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
No Pain No Gain!
  Mit Zitat antworten Zitat
Benutzerbild von Smokey
Smokey

Registriert seit: 10. Nov 2003
Ort: Puerto de la Cruz
158 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 11:28
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.
Greif dir ein gutes Stück Fleisch auf deinem Weg nach draussen !!!
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#7

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 11:40
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

Dieses Statement aufzuteilen ist auf jedenfalls kaum möglich, aber ich denke weiter darüber nach
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
Robert_G
(Gast)

n/a Beiträge
 
#8

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 11:52
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.
  Mit Zitat antworten Zitat
Touchdown

Registriert seit: 17. Feb 2003
227 Beiträge
 
#9

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 12:23
@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.
function getallfornothing: TGoldesel;
begin
result := TGoldesel.create;
end;
  Mit Zitat antworten Zitat
OLLI_T

Registriert seit: 13. Okt 2003
Ort: Nähe Wetzlar / Hessen
143 Beiträge
 
Delphi 5 Enterprise
 
#10

Re: SQL Problem mit Interbase

  Alt 20. Nov 2003, 12:34
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
No Pain No Gain!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 22:39 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