[NEWSboard IBMi Forum]

Thema: SQL Problem

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

    SQL Problem

    Hallo zusammen

    ich habe folgende Tabelle

    Mark Nummer Num2 VKDAT Beleg POS Zeile
    -----------------------------------------------------
    X 310000006 90080 20210209 4900030919 0002 1
    X 310000006 90080 20210209 4900030919 0001 2
    _ 310000006 90080 20201102 4900026071 0002 3
    X 310000006 90080 20201102 4900026071 0001 4
    X 310000006 90080 20201102 4900026058 0002 5
    X 310000006 90080 20201102 4900026058 0001 6
    _ 310000006 90080 20190826 4900002810 0002 7
    _ 310000006 90080 20190826 4900002810 0001 8
    X 310000006 90080 20190823 4900002762 0004 9
    _ 310000006 90080 20190823 4900002762 0003 10
    X 310000006 90080 20190823 4900002762 0002 11
    _ 310000006 90080 20190823 4900002762 0001 12
    _ 310000006 90080 20190815 4900002531 0001 13
    X 310000006 90082 20190815 4900002531 0001 14
    _ 310000006 90082 20190815 4900002531 0001 15
    X 310000007 90081 20190815 4900002531 0001 16

    Ich soll nun mittels SQl ermitteln wann eine Nummer + Num2 ein X erhält und wann nicht .
    Die erste Spalte repräsentiert ab welchen Datum eine Nummer ein X erhält .


    Beispiel Abfrage. Welchen Wert hat die Spalte Mark bei der Nummer 310000006 Num2 = 90080 am 20201115 . Hier sollte ein _ zuückgegeben werden weil der letzte Eintrag davor ein _ hatte -> Zeile 3.

    Frage ich den 20190823 ab sollte ein X zurückkommen weil der gösste Eintrag an diesem Tag Pos 4 ein X hatte ..

    Frage ich den 20190828 ab sollte ein _ zurückkommen weil der letzte Eintag davor ein _ hatte -> Zeile 7 ..

    Die letzte Spalte ist nicht in der Datei vorhanden (Zeile)
    Weiss da jemand ein gutes SQL ?
    Gruss

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.696
    Du must in 2 Schritten vorgehen:
    Zunächst musst Du das höchste (numerische) Datum ermitteln, das kleiner oder gleich dem eingegebenen Datum ist.
    Dann verknüpfst Du das Ergebnis mit der Tabelle und ermittelst für die höchste Position den Wert in Mark.
    Etwa so:
    Code:
    With x as (Select Nummer, Num2, Max(VKDAT) MaxVkDat
                 from YourTable
                 Where     Nummer = 310000006
                       and Num2   = 90080
                       and VKDat <= 20190828
                 Group By Nummer, Num2)
    Select Mark from x join yourTable y on x.Nummer = y.Nummer
                                        and x.Num2 = y.Num2
                                        and VKDat  = MaxVkdat
    Order By Zeile Desc Limit 1;
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion 2021
    Virtuelle SQL und RPG Schulungen

  3. #3
    Registriert seit
    Nov 2007
    Beiträge
    368
    Danke für den Beitrag . Ist irgendwie verloren gegangen in meinem ersten Posting . Keine CTE's und kein Select top 1 etc .. Das macht es ja so schwierig . Es sollte zum schluss mit
    select MARk from Table where on x.Nummer = y.Nummer and x.Num2 = y.Num2
    and x.datum <= VKDAT zugegriffen werden können

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.696
    Was darfst Du denn dann überhaupt verwenden?
    Ich würde empfehlen ein Programm (mit native I/O) zu schreiben, dann brauchst Du überhaupt kein SQL.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion 2021
    Virtuelle SQL und RPG Schulungen

  5. #5
    Registriert seit
    Nov 2020
    Beiträge
    56
    Darf es denn Subselects sein?
    Dann könntest du mit einem Subselect alle Sätze >= deinem Datum, das dann nach POS absteigend (DESC) sortieren und davon den ersten via Fetch First Row ermitteln.
    Dann hast du auch dein X oder _
    Falls eben nur kein CTE erlaubt ist aber ein Subselect schon ... warum auch immer es solche Vorgaben gibt.

    lg Andreas

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    18.984
    Statt CTE kann man den "x"-Ausdruck auch direkt
    Code:
    Select Mark from
       (Select Nummer, Num2, Max(VKDAT) MaxVkDat
          from YourTable  
       Where     Nummer = 310000006
           and Num2   = 90080
           and VKDat <= 20190828
        Group By Nummer, Num2
    ) x
    join yourTable y on x.Nummer = y.Nummer
                          and x.Num2 = y.Num2
                          and VKDat  = MaxVkdat
    Order By Zeile Desc
    fetch first 1 rows only
    kodieren:
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: http://www.fuerchau.de/software/upload400.htm
    BI? Da war doch noch was: http://www.ftsolutions.de

  7. #7
    Registriert seit
    Nov 2007
    Beiträge
    368
    wenn das leben normal laufen würde hätte ich es so gelöst

    with blabla as (
    SELECT nummer,num2, vkdat, max(UMZST) as aaa FROM table
    group by nummer,num2, vkdat
    order by nummer,num2, vkdat )

    select top 1 aaa from test where nummer=parmnummer and num2=parmnum2 and vkdat <= parmvkdat
    order by nummer desc,num2 desc , vkdat desc

    und fertig wär die lutzi . Aber das Leben ist nicht normal .. das ganze muss in views und zwar alles getrennt . cte und first top soll nicht verwendet werden

  8. #8
    Registriert seit
    Aug 2006
    Beiträge
    1.939
    Vielleicht drückst Du dem jenigen der solche Vorgaben macht mal einen Abakus in die Hand. Die Russen rechnen noch heute gerne damit.
    Alternativ die Firma wechseln und zu einem vernünftigen Laden gehen. Soll es noch geben, wenn leider auch sehr wenige....

  9. #9
    Registriert seit
    Aug 2001
    Beiträge
    2.696
    Wenn Du eine View anstatt einer CTE verwenden sollst, warum machst Du dann nicht aus der CTE eine View und verwendest diese?

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion 2021
    Virtuelle SQL und RPG Schulungen

  10. #10
    Registriert seit
    Nov 2007
    Beiträge
    368
    glaub ich machs so ..
    view 1
    SELECT nummer,num2, vkdat, max(UMZST) as umzst FROM table
    group by nummer,num2, vkdat
    order by nummer,num2, vkdat )

    view 2
    select nummer,num2,Max(vkdat) , max(umzst)from view1
    group by nummer, num2

    select UMZST from view2 where nummer='000000000310000006' and num2='9000000080' and VKDAT <= '20201202'

    sollte funzen ...

  11. #11
    Registriert seit
    Jan 2003
    Beiträge
    687
    Zitat Zitat von woodstock99 Beitrag anzeigen
    sollte funzen ...
    ...und Teil Deiner Strategie werden. Logik aus dem Code in die Datenbank zu legen (kombinierte Views) ist ein anerkennenswerter Ansatz.

Ähnliche Themen

  1. CL-Problem
    Von iginla im Forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 31-03-03, 10:59
  2. QRY - Problem
    Von Günter Majewski im Forum IBM i Hauptforum
    Antworten: 0
    Letzter Beitrag: 07-01-03, 16:10
  3. SQL - Problem
    Von Tommy im Forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 16-12-02, 17:43
  4. SQL Problem
    Von HoScHiE im Forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 03-06-02, 14:30
  5. SQL-Problem
    Von chrisi im Forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 27-02-02, 09:46

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •