[NEWSboard IBMi Forum]
Seite 1 von 3 1 2 ... Letzte

Thema: sql problem

  1. #1
    Registriert seit
    Nov 2007
    Beiträge
    371

    sql problem

    Hallo,

    ich hätte mal eine Frage.

    ich muß aus einer Datei Datensätze über bestimmte Filtervorgaben die der User eingibt filtern und in eine Datei schreiben.

    Gibt es jetzt in SQL die möglichkeit eine Art If-Abfrage einzubauen???
    wenn anskunde = X dann innerjoin Datei A
    else inner join Datei B

    select rechnr, anskunde, KUNDENNR, ort, plz, name from QS36f/debisudl
    left outer join qs36f/KDSTAMM on kundennr = k00001

    ergibt z,b folgendes
    RECHNUNGSNUMMER ANSCHRIFTINKUNDENAD KUNDENNR
    1 Zeile:00199 . 69.531
    2.Zeile:00251 X 78.913

    Wenn jetzt ein X in ANSCHRIFTKUNDENAD steht muß die Adresse von Datei A genommen werden
    wenn nicht dann von Datei B. kann man das in einer Anweisung realisieren??

    Die drei Felder(RECHNR,ANSKUNDE,KUNDENNR kommen aus debisudl)

    Die Felder Ort,Name,PLZ sollen aus Datei A oder B kommen.

    Nicht das ich falsch verstanden werde aber ich will die Datei durch eine SQl Anweisung komplett füllen .


    Sorry aber in SQL bin ich nicht so fit .


    kann man das mit
    select rechnr, anskunde, KUNDENNR, ort, plz, name from QS36f/debisudl
    CASE
    WHEN anskunde = X
    select substr(feld1,2,10) as ort ,substr(feld1,2,10) as plz,substr(feld1,2,10) as name from a
    else
    select substr(feld3,21,10) as ort,substr(feld3,2,10) as plz ,substr(feld3,50,10) as name from B..
    end

    Die Dateien A und B sind intern beschrieben erstellt worden

  2. #2
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Das könnte vielleicht in etwa so gehen:
    Code:
    SELECT * FROM FILE F INNER JOIN FILEA A ON F.NUM=A.NUM WHERE TYP ='X'
    UNION
    SELECT * FROM FILE F INNER JOIN FILEB B ON F.NUM=B.NUM WHERE TYP<>'X'

  3. #3
    Registriert seit
    Nov 2007
    Beiträge
    371
    habe ich mir auch schon überlegt aber das Problem ist dann wie fülle ich die Felder Ort,plz,name???

    Sie sollen ja einmal von dieser Datei gefüllt werden und einmal von der anderen.
    Dazu kommt noch das die Feldnamen in Datei A und B unterscheidlich sind und das ich bei Datei A die Werte mittels substr auslesen und dem Feld Ort usw zuweisen muß. Dito Datei B.


    Nochmal ein Beispiel.

    D I E S E R S E L E C T soll nur ein Beispiel sein. Er löst auf keinen Fall das Problem das ich hab. evtl kann ihn ja jemand so erweitern das es dann funktionieren würde!!!


    select A.rechnr, A.anskunde, A.KUNDENNR, ort ??? einmal aus datei a kommen andere mal aus datei B
    from QS36f/debisudl as a, Qs36F/KDSTAMM as B, qs36f/debisudl As C
    where a.kundennr = b.k00001 or ( soll nur ausgeführt werden wenn a.kundennr <> b.k00001 ist ) a.Rechnr = C.rechnr

    also wenn a.kundennr = b.k00001 nicht vorhanden ist dann sollte a.Rechnr = C.rechnr greifen.

    und das Feld ORT sollte wenn
    a.kundennr = b.k00001
    mittels substr(b.f00002, 5, 20) gefüllt werden

    else
    when a.Rechnr = C.rechnr
    mittels substr(b.f00003, 21, 20) gefüllt werden
    .

    Wie gesagt geht das überhaupt???

  4. #4
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Das ist jetzt aber eine andere Aufgabe als die vorhergehende!?

  5. #5
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Zitat Zitat von woodstock99 Beitrag anzeigen
    und das Feld ORT sollte wenn
    a.kundennr = b.k00001
    mittels substr(b.f00002, 5, 20) gefüllt werden

    else
    when a.Rechnr = C.rechnr
    mittels substr(b.f00003, 21, 20) gefüllt werden
    Ist das wirklich "b.f00003"? Welcher Datensatz aus Datei b ist dann damit gemeint?

  6. #6
    Registriert seit
    Nov 2007
    Beiträge
    371
    im endeffekt nicht.

    es geht nur darum ob man eine if abfrage einbauen kann.

    ist das gleich mit dem dann tu das usw und ob es möglich ist in der ersten select anweisung ein feld z.b. ort aus zwei unterschiedlichen dateien zu füllen je nachdem welche bedingung erfüllt ist.

    on jetzt ankunde = X
    oder ob a.rechnr = b. rechnr
    das kommt ja aufs gleich raus oder??
    sollte ja nur ein beispiel sein!!

    wie gesagt es geht nur darum ist das überhaupt möglich in einer abfrage unterzubringen!!! und wenn ja wie?

    aber trotzdem danke erstmal für die zeit die du aufgebracht hast.

  7. #7
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Was spricht denn gegen zwei SELECTs, verbunden durch ein UNION?
    Code:
    SELECT F.RECHNR, F.ANSKUNDE, F.KUNDENNR,                
    SUBSTR(A.FELD1,  1, 4) AS NAME,                         
    SUBSTR(A.FELD1,  5, 6) AS STRASSE,                      
    SUBSTR(A.FELD1, 11, 3) AS ORT                           
    FROM FILE F INNER JOIN FILEA A ON F.KUNDENNR=A.KUNDENNR
    WHERE ANSKUNDE  ='X'                                    
    UNION                                                   
    SELECT F.RECHNR, F.ANSKUNDE, F.KUNDENNR,                
    SUBSTR(B.FELD1,  1, 4) AS NAME,                         
    SUBSTR(B.FELD1,  5, 6) AS STRASSE,                      
    SUBSTR(B.FELD1, 11, 3) AS ORT                           
    FROM FILE F INNER JOIN FILEB B ON F.KUNDENNR=B.KUNDENNR
    WHERE ANSKUNDE <>'X'

  8. #8
    Registriert seit
    Nov 2007
    Beiträge
    371
    aber bei union muss ja datei a unb den geleichen satzaufbau haben oder??
    den haben sie definitiv nicht

  9. #9
    Registriert seit
    Nov 2003
    Beiträge
    2.307
    Zitat Zitat von woodstock99 Beitrag anzeigen
    aber bei union muss ja datei a unb den geleichen satzaufbau haben oder??
    den haben sie definitiv nicht
    Bei UNION müssen nur die verbundenen SELECTs den gleichen Satzaufbau besitzen.

  10. #10
    Registriert seit
    Nov 2007
    Beiträge
    371
    danke erstmal für die antwort. ich werde es am montag mal ausprobieren ob es klappt. vielen dank erstmal

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    Alles viel einfacher:

    select ...
    case
    when anskunde = 'X' then
    a.feld1
    else
    b.feld1
    end as feld1
    ,
    case
    when anskunde = 'X' then
    a.feld2
    else
    b.feld2
    end as feld2
    :
    :
    from myfile
    left join filea a on ...
    left join fileb b on ...
    where ...

    Für jedes Feld ist eine Case-Ausdruck erforderlich.
    Durch den "left join" ist sichergestellt, dass aus MyFile alle und aus FileA und FileB die vorhandenen Sätze gewählt werden.

    Ggf. kann per "coalesce(f.feldx, ' ')" ein NULL-Wert ausgeschlossen werden.

    Union ist nicht unbedingt die ideale Lösung.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  12. #12
    Registriert seit
    Nov 2007
    Beiträge
    371
    Hallo,

    also zuerst einmal Danke an alle.
    Ich habe mich für die Version von Herrn Fuerchau entschieden.


    Mein Select

    select cast(substr(digits(A.DATUM), 5, 2) as numeric) as jahr ,
    cast(substr(digits(a.datum) , 3, 2) as numeric) as monat,
    cast(substr(digits(a.datum) , 1, 2) as numeric) as tag,
    a.rechnr, anskunde, kundennr,
    case when Anskunde = 'X'
    then
    substr(z.f00002 , 5, 10)
    else
    y.anschri2
    end as ort
    from Qs36f/DebiSudl as a
    left outer join qs36f/KDSTAMM as Z on kundennr = z.k00001
    left outer join qs36f/debisudt as Y on a.rechnr = y.rechnr
    and y.umerkmal = '3'

    so nun hätte ich noch zwei Fragen.

    Frage 1:
    Kann ich das Feld Ort das ich mir erzeuge durch ' end as ort ' irgendwie noch abfragen??
    z.B. where Ort Like '%berg%'

    In der where Klausel wenn ich es mit einbaue kommt immer die Fehlermeldung ' Feld nicht in Tabelle' .

    Frage 2:

    Das Feld A.Adatum ist ein 6 0 Feld in der Datei. Gefüllt mit ttmmjj.
    (Das ist echt eine Datenhaltung die wir hier haben das es der Sau graust )

    kann man das in ein echtes Datumsfeld umwandeln ??
    Mit Date oder??
    Aber dazu müsste ich dann beim Jahr 1900 oder 2000 addieren .
    Dies kann ich wahrscheinlich wieder mit Case abfragen oder??


    Zur Erkärung. Der User soll die möglichkeit haben Datensätze per Datum einzuschränken. aber das Datum in der Datei ist wie immer bei uns kein Datumsfeld .




    Danke nochmal.........

Similar Threads

  1. problem mit eigener sql function
    By Stefan_Sk in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-05-06, 16:37
  2. SQL Problem
    By Lucky4712 in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-05-06, 15:57
  3. Problem bei Abfrage bei Imbedded SQL
    By cbe in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 08-06-05, 16:21
  4. embedded SQL Performance Problem mit SCROLL
    By itec01 in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 16-09-04, 18:38
  5. Problem bei ILE COBOL mit sql connect to
    By rebe in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 07-09-01, 13:55

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •