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

Hybrid View

  1. #1
    Registriert seit
    Feb 2006
    Beiträge
    25

    MAX in SQL mit Datum Zeit und Suffix

    Guten Tag zusammen

    ich stecke wieder einmal fest und brauche Hilfe. Ich muss eine Datei erstellen mit dem letzten Eintrag aus den Artikeltransaktionen.

    Lagerort Artikel Datum Zeit Suffix
    LO ARTIKEL_1 20080929 112614 1 fficeffice" />>>
    LO ARTIKEL_1 20080929 112655 1 >>
    LO ARTIKEL_1 20080930 62455 1 >>
    LO ARTIKEL_1 20080930 62516 1 >>
    LO ARTIKEL_1 20080930 82339 1 >>
    LO ARTIKEL_1 20080930 82351 1 >>
    LO ARTIKEL_1 20080930 133526 1 >>
    LO ARTIKEL_1 20080930 133529 1 >>
    LO ARTIKEL_1 20081001 90817 1 >>
    LO ARTIKEL_1 20081001 90834 1

    Mein SQL Statement sollte den fett markierten Satz zurückgeben. Zusätzliches Problem ist, dass bei der Zeit ohne führende Nullen abgespeichert wird.

    momentan versuch ichs wie folgt:

    select Lagerort, Artikel, max(trim(char(Datum)) || trim(char(Zeit)) || trim(char(Suffix)))
    where Lagerort = 'LO' and Datum between 20080901 and 20080930
    Group by Lagerort, Artikel

    Leider bekomm ich aber nicht den gewünschten Satz zurück.

    Besten Dank für eure kompetente Hilfe
    Grüss
    mikka_71

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    Wenn dein Datum- und Zeitfeld numerisch ist, verwende DIGITS(Feld) statt char(Feld) und lass das TRIM weg.
    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

  3. #3
    Registriert seit
    Feb 2006
    Beiträge
    25
    Besten Dank. Da komme ich doch schon etwas weiter.

    Grüsse
    mikka_71

  4. #4
    Registriert seit
    Feb 2006
    Beiträge
    25
    Hallo zusammen...

    immer noch das gleiche Problem. Ich muss nun schrittweise vorgehen und schaffe es wirklich nicht.

    Meine Datei ist immer noch gleich. Mit meinem ersten Statement hole ich das höchste Datum:

    INSERT INTO INV_HELP fficeffice" />>>
    SELECT >>
    Lagerort,
    Artikel,
    max(Datum) ,
    0,
    0
    FROM >>
    mittra >>
    WHERE >>
    Lagerort = 'LO' and Datum between FromDate (yyyymmdd) and ToDate (yyyymmdd) >>
    GROUP BY
    Lagerort, Artikel

    Die Daten welche geliefert werden sehen so aus:


    Lagerort>>
    Artikel>>
    Datum>>
    Zeit>>
    Suffix>>
    LO>>
    Artikel_1>>
    20080930. >>
    0>>
    0>>
    LO>>
    Artikel_2 >>
    20080918. >>
    0>>
    0>>
    LO>>
    Artikel_3 >>
    20080926. >>
    0>>
    0>>
    LO>>
    Artikel_4 >>
    20080926.>>
    0>>
    0>>


    Das nächste Statement soll mir nun die höchste Zeit des Artikels an den Datum holen. Doch entweder bekomm ich nur das höchste Datum für alle Artikel zurück:

    update inv_help as T1 set T1.Zeit>>
    select max(digits(T2.zeit) from T1 inner join Transaktionen as T2 on T1.Lagerort = and itno T2. Lagerort and T1.Artikel = T2.Artikel and T1.Datum = T2.Datum)

    oder mit EXISTS die Meldung SQL0811 Fehler 2.

    update inv_help as T1 set T1.Zeit>>
    (select max(digits(T2.zeit) from T1 inner join Transaktionen as T2 on T1.Lagerort = and itno T2. Lagerort and T1.Artikel = T2.Artikel and T1.Datum = T2.Datum group by T1.Lagerort, T1.Artikel,T1.Datum) >>
    where exists>>
    (select max(digits(T2.zeit) from T1 inner join Transaktionen as T2 on T1.Lagerort = and itno T2. Lagerort and T1.Artikel = T2.Artikel and T1.Datum = T2.Datum group by T1.Lagerort, T1.Artikel,T1.Datum) >>

    Das gleiche erwartet mich noch um den höcsten Zeittsuffix zu holen. Weiss eventuell jemand einen bessern, sprich schnelleren Weg? Ich habe 28Millionen Artikeltransaktionen in der Basisdatei!!

    Liebe Grüsse
    mikka_71

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Hallo,

    wenn ich die Aufgabenstellung richtig verstehe, versuchst Du pro Lager und Artikel den letzten Satz (höchstes Datum mit der höchsten Zeit) zu ermitteln und in die zweite Datei zu übertragen.

    Wie Du bereits festgestellt hast, brauchst dazu mehrere Schritte.
    1. Der Satz mit dem höchsten Datum muss ermittelt werden
    2. Die höchste Urzeit des ausgewählten Datums muss ermittelt werden.
    3. Mit diesen Informationen muss der entsprechende Satz ermittelt werden und in die zweite Datei eingefügt werden.

    Versuch's mal mit folgendem Statement:
    PHP-Code:
    Insert into mytable2
    Select c
    .*
       
    from  (select Lager aLagerArtikel aArtikelMax(DatumaDatum
                from MyTable 
                where Lager 
    'LO' and Datum between 20080901 and 20080930
                Group by Lager
    Artikela
        join 
    (Select Lager bLagerArtikel bArtikelDatum bDatumMax(ZeitbZeit
                from MyTable 
                group by Lager
    ArtikelDatumb
        On aLager 
    Blager and aArtikel bArtikel and aDatum bDatum
        Join  MyTable c
        on Lager 
    aLager and Artikel bArtikel and Datum aDatum and Zeit bZeit 
    Anstatt Sub-Selects in der From-Anweisung könnten auch Common Table Expressions verwendet werden.
    Auf alle Fälle sollten Zugriffswege (DDS beschriebene logische Dateien oder SQL Indices) über Lager/Datum und Lager/Artikel/Datum/Zeit vorhanden sein.

    Bei der obigen Lösung können Zugriffswege verwendet werden. Bei einer Lösung, bei der eine oder mehrere Spalten konvertiert und verknüpft werden, nimmt man dem Optimizer jede Möglichkeit (zumindest vor Release 6.1) Zugriffswege für diese Spalten zu verwenden. Die Folge ist u.U. ein Table Scan, d.h. jeder Satz in der Datei wird gelesen.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  6. #6
    Registriert seit
    Feb 2006
    Beiträge
    25
    Besten Dank Brigitta

    Ich benutze natürlich logische Dateien. Aber ich schaff esw nicht, deinLeider schaff ich es mit deinem Statement nicht. Ich bin nicht so versiert, dies umzusetzen oder meine schwarzgrüne Oberfläche will mir nicht helfen.

    Ich habe nur zwei Tabellen.

    Tabelle 1 ist die zu befüllende mit Lagert/Artikel/Datum/Zeit/Suffix und Tabelle 2 sind die Artikeltransaktionen.

    Ich bin etwas ratlos.

    mikka_71

  7. #7
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    Ich benutze natürlich logische Dateien. Aber ich schaff esw nicht, deinLeider schaff ich es mit deinem Statement nicht. Ich bin nicht so versiert, dies umzusetzen oder meine schwarzgrüne Oberfläche will mir nicht helfen.

    Ich habe nur zwei Tabellen.

    Tabelle 1 ist die zu befüllende mit Lagert/Artikel/Datum/Zeit/Suffix und Tabelle 2 sind die Artikeltransaktionen.

    Ich bin etwas ratlos.
    1. Die Verwendung von DDS beschriebenen logischen Dateien in SQL ist so ziemlich das ungeschickteste, was man machen kann. In SQL Statements sollten immer die physischen Dateien oder SQL Views verwendet werden. Bei der Verwendung von logischen Dateien muss das SQL-Statement zunächst vom Optimizer so umgeschrieben werden, dass direkt die physischen Dateien angesprochen werden.

    2. Bunte Oberflächen helfen Dir auch nicht weiter.

    3. Versuche zunächst das SELECT-Statement ohne Insert auszuführen. (Den Insert kann man als letztes drum rum bauen).

    4. In dem SQL-Select-Statement werden quasi 3 "Dateien" erstellt miteinander verknüpft. Dabei wird immer Bezug auf die gleiche Datei genommen.
    In der 1. Datei, die über einen Sub-Select temporär generiert wird, wird das höchste Datum für den angegebenen Lagerort im angegebenen Zeitraum ermittelt.
    Das Ergebnis dieser Abfrage wird über Lager, Artikel und Datum wird wiederum mit der Original-Datei verknüpft, um die höchste Zeit für den in der 1. Abfrage ermittelten Lager, Artikel und Datum zu ermitteln. (2. Sub-Select)
    Im 3. Schritt wird dann das Ergebnis aus der Verknüpfung der ersten beiden Abfragen mit der Original-Datei verknüpft um den kompletten Datensatz und nicht nur Teile davon zu selektieren.
    Am einfachsten ist, wenn Du die einzelnen Sub-Selects nacheinander aufbaust und jeweils prüfst.

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  8. #8
    Registriert seit
    Feb 2006
    Beiträge
    25
    Zu Punkt 1. Danke. Habe ich nicht gewusst.

    Zu Punkt 2. Meinte damit eine etwas bedienerfreundlichere Umgebung.

    Zu Punkt 3. Bin ich dran. Muss ja noch versuchen den Suffix irgendwie da ranzujoinen. Es ist möglich dass mehrere Transaktionen zur gleichen Zeit geschrieben werden, diese werden dan fortlaufend hochgezählt.

    Ich versuchs mal und hoffe, dass ich es diese Mal schaffe.

    Danke
    mikka_71

  9. #9
    Registriert seit
    Jan 2007
    Beiträge
    189
    Sie können mal so versuchen:
    Code:
    select Lagerort, Artikel, trim(char(Datum)) || trim(char(Zeit)) || trim(char(Suffix))
    where Lagerort = 'LO' and Datum between 20080901 and 20080930
    order by Lagerort, Artikel desc
    fetch first row only

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.696
    @kitvb1
    Tut mir Leid, aber das ist sowas von falsch:
    Sortierung des Begriffes "trim(..." fehlt, da ja hier das letzte ermittelt werden soll und nicht der letzte Artikel.
    Ausserdem werden durch char(Datum) und char(Zeit) Vornullen entfernt (siehe auch oben), was zur falschen Sortierung führt.
    Mein Vorschlag war ja DIGITS zu nehmen und TRIM zu entfernen:

    select Lagerort, Artikel, max(digits(Datum) || digits(Zeit) || char(Suffix))
    where Lagerort = 'LO' and Datum between 20080901 and 20080930
    Group by Lagerort, Artikel
    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

  11. #11
    Registriert seit
    Nov 2003
    Beiträge
    2.403
    Anderer Vorschlag:
    Code:
    SELECT   *                                  
    FROM     DATTIMP                            
    WHERE   (LAGERORT,ARTIKEL,DATUM,ZEIT) IN (  
    SELECT   LAGERORT,ARTIKEL,DATUM,MAX(ZEIT)   
    FROM     DATTIMP                            
    WHERE   (LAGERORT,ARTIKEL,DATUM) IN (       
    SELECT   LAGERORT,ARTIKEL,MAX(DATUM)        
    FROM     DATTIMP                            
    WHERE    LAGERORT='LO'                      
    AND      DATUM BETWEEN 20080901 AND 20080930
    GROUP BY LAGERORT,ARTIKEL)                  
    GROUP BY LAGERORT,ARTIKEL,DATUM)            
    ORDER BY LAGERORT,ARTIKEL,DATUM,ZEIT

  12. #12
    Registriert seit
    Jan 2007
    Beiträge
    189
    @Fuerchau,

    Tjcha, da haben Sie vollkommen recht, weiss ich auch nicht ich da gedacht habe. Senioren moment?

Similar Threads

  1. SQL Datum
    By steven_r in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 04-12-06, 12:16
  2. SQL: Aus mehreren Feldern ein Datum erkennen
    By I0N in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 21-11-06, 12:44
  3. SQL DATUM
    By steven_r in forum NEWSboard Programmierung
    Antworten: 1
    Letzter Beitrag: 20-11-06, 18:37
  4. Aktuelle Datum und Zeit bei Free-Form
    By lossin in forum IBM i Hauptforum
    Antworten: 4
    Letzter Beitrag: 08-02-06, 14:09
  5. SQL Datum aus Kalenderwoche?
    By miro in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 11-09-05, 11:11

Berechtigungen

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