[NEWSboard IBMi Forum]

Thema: SQL

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

    SQL

    HAllo zusammen,

    ich habe ein SQL Problem . Und zwar will ich von der folgenden Tabelle
    folgende Felder

    TABLENAME + Schlüssel , ANLAGEUSER + CreationDate + und Creation Time (MAX DATUM+ ZEIT) und Anlageuser as letzteraenderer und das letzte Änderungsdatum + Uhrzeit (MIN DATUM + Uhrzeit) Also MIN MAX Wert.

    Das Problem ist das die Zeit und das Datum 2 Felder sind (Das muss auch so bleiben )

    Bei Max Datum / Max Zeit nimmer er die falsche Uhrzeit .
    Wenn ich nach den Feldern ART / TAbellenname / Schlüssel / Tabllenfeld groupiere bekomme ich zwar dann das richtige Max Datum + Uhrzeit aber der User fehlt .

    ART TableName SCHLüssel TABELLENFELD ANLAGEUSER CreationDate CreationTime
    ARTIKEL TABELEXXY 815 KEY USER1 20180111 114533
    ARTIKEL TABELEXXY 815 FELD1 USER2 20180307 52515
    ARTIKEL TABELEXXY 815 FELD2 USER2 20180307 52908
    ARTIKEL TABELEXXY 815 FELD3 USER2 20180319 102217
    ARTIKEL TABELEXXY 815 FELD4 USER2 20180403 94713
    ARTIKEL TABELEXXY 815 FELD5 USER2 20180403 94713
    ARTIKEL TABELEXXY 815 FELD6 USER2 20180403 94713
    ARTIKEL TABELEXXY 815 FELD7 USER2 20180403 94713
    ARTIKEL TABELEXXY 815 FELD8 USER2 20180906 90427
    Kunde TABAAAAA 66666 FELD9 USER2 20180910 20320
    Kunde TABELEXXY 33333 FELD10 USER2 20180917 44720
    Kunde TABELEXXY 55555 FELD11 USER2 20180917 35800
    Kunde TABELEXXY 66666 FELD13 USER2 20181205 12847
    Kunde TABELEXXY 66666 FELD13 USER2 20181206 12925
    ARTIKEL TABELEXXY 815 FELD14 USER2 20181206 12925
    ARTIKEL TABELEXXY 815 FELD15 USER2 20181207 33331
    ARTIKEL TABELEXXY 815 FELD3 USER2 20181207 33331
    ARTIKEL TABELEXXY 815 FELD17 USER3 20180122 20456
    ARTIKEL TABELEXXY 815 FELD18 USER3 20180122 20456
    ARTIKEL TABELEXXY 815 FELD19 USER3 20180122 20456
    ARTIKEL TABELEXXY 815 FELD20 USER3 20180122 21037
    ARTIKEL TABELEXXY 815 FELD21 USER3 20180122 21037
    ARTIKEL TABELEXXY 815 FELD22 USER2 20180215 104919
    ARTIKEL TABELEXXY 815 FELD23 USER2 20180215 104919
    ARTIKEL TABELEXXY 815 FELD24 USER2 20180220 92721
    ARTIKEL TABELEXXY 815 FELD25 USER2 20180220 92721
    ARTIKEL TABELEXXY 815 FELD3 USER2 20180220 110530
    ARTIKEL TABELEXXY 815 FELD27 USER2 20180221 82906
    ARTIKEL TABELEXXY 815 FELD28 USER2 20180221 21446
    ARTIKEL TABELEXXY 815 FELD29 USER2 20180307 43744
    ARTIKEL TABELEXXY 815 FELD30 USER2 20180307 45645
    ARTIKEL TABELEXXY 815 FELD3 USER2 20180307 50113
    ARTIKEL TABELEXXY 815 FELD32 USER2 20180307 51504

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    18.589
    Wenn du V7R3 hast (ggf. 7.2 mit irgendeinem TR):
    select .... last_value(CHAR(Datum) concat char(Zeit)) over (partition by TABLENAME , Schlüssel , ANLAGEUSER order by CHAR(Datum) concat char(Zeit) desc)
    from ...

    Ansonsten kannst du auch eine derived Table/CTE verwenden:

    select TABLENAME , Schlüssel , ANLAGEUSER, max(andat)
    from (
    select TABLENAME , Schlüssel , ANLAGEUSER
    ,CHAR(Datum) concat char(Zeit) as andat
    from mytable
    ) hugo
    group by TABLENAME , Schlüssel , ANLAGEUSER
    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

  3. #3
    Registriert seit
    Nov 2007
    Beiträge
    364
    Nein ich kann keine CTE's etc verwenden und ich brauche das Datum und die Zeit in 2 verschiedenen Feldern . Das macht ja das ganze so kompliziert .. Oder ich seh vor lauter Wald die Bäume nicht ..

  4. #4
    Registriert seit
    Sep 2005
    Beiträge
    315
    warum nicht max(datum*1000000+zeit)

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    4.919
    du kannst die zwei Felder zu einem timestamp zusammenfassen (timestamp ( datumsfeld, zeitfeld) und dann danch gruppieren, oder was immer du willst. Auch die kleinste Zeit zum größten Datium geht, dann muss man die Zeit vom Datum abziehen (timestamp(datumsfeld) - hour(zeitfeld) hours
    - minute(zeitfeld) minutes - second(zeitfeld) seconds) dann das maximum davon.

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.621
    Mir ist zwar nicht klar warum Du weder Common Table Expressions, noch verschachtelte Sub-Selects verwenden kannst.
    Wenn ich das richtig verstanden habe, willst Du zwar den Maximal bzw. den Minimal-Wert der zusammengefassten Datums- und Zeit-Werte, aber dennoch 2 Spalten ausgeben, ... und das ohne CTE.

    Das Problem bei Max() und Min() ist, dass Du nur einen Wert angeben kannst, du aber dennoch 2 Spalten möchtest und das ohne CTE!

    Dann musst Du beide Werte zusammenfassen, und dann den Maximal- bzw. den Minimal-Wert wieder auseinanderdröseln. Wirklich nicht schön, aber so sollte es gehen:
    Code:
    Select Guppierungskriterien,
           Dec(Left( Max(Digits(CreationDate) concat Digits(CreationTime)), 8), 8, 0) MaxDate,
           Dec(Right(Max(Digits(CreationDate) concat Digits(CreationTime)), 6), 6, 0) MaxTime,
           Dec(Left( Min(Digits(CreationDate) concat Digits(CreationTime)), 8), 8, 0) MinDate,
           Dec(Right(Min(Digits(CreationDate) concat Digits(CreationTime)), 6), 6, 0) MinTime,
      from YourSchema.YourTable
      Group By Gruppierungskriterien
      Order BY ...;
    Birgitta
    Birgitta Hauser

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

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    18.589
    Natürlich geht das auch ohne CTE mit Derived Table.

    select TABLENAME , Schlüssel , ANLAGEUSER, substr(andat, 1, 10), substr(andat, 11, 8)
    from (

    select TABLENAME , Schlüssel , ANLAGEUSER, max(andat) as andat
    from (
    select TABLENAME , Schlüssel , ANLAGEUSER
    ,CHAR(Datum) concat char(Zeit) as andat
    from mytable
    ) hugo
    group by TABLENAME , Schlüssel , ANLAGEUSER

    ) hugo2

    Wenn deine Felder vom Typ DATE und TIME sind und du die TIMESTAMP-Funktion nimmst wie oben beschrieben, kannst du die Werte auch wieder per Date(andat), Time(Andat) splitten.

    Eine CTE ist nur eine andere Schreibweise.
    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

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    4.919
    ... besser weil einfacher ist ohnehin eine View!!!

    D*B

    und PX (pleipt xund)
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    18.589
    Jein.
    CPYTOIMPF verlangt eine TABLE/PF.
    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

  10. #10
    Registriert seit
    Mar 2002
    Beiträge
    4.919
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Jein.
    CPYTOIMPF verlangt eine TABLE/PF.
    ... von CPYTOIMPF habe ich in der Frage nix gesehen - und überdies geht das bei mir auch mit einer View.
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    18.589
    Stimmt! Wieder was gelernt;-).
    Außerdem habe ich da 2 verschiedene Threads vermischt. Kann ja schon mal passieren.
    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

Berechtigungen

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