[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Apr 2005
    Beiträge
    385

    Problem mit einer SQL-Abfrage

    Hallo zusammen,

    ich habe ein Problem mit einer SQL-Abfrage, wo ich leider absolut keine Lösung habe da ich den Fehler nicht sehe

    Fehlermeldung
    Code:
    QL-Status: 42601
    Vendorencode: -104
    Nachricht: [SQL0104] Token 01 ungültig. Gültige Token: ) FETCH...
    Hier die Abfrage
    Code:
    SELECT DISTINCT                                                 
              T01.FLD1,T01.FLD2, COUNT(T02.FLD2), SUM(T02.FLD3),
              T03.FLD1
    FROM TAB1 AS T01                                            
    left JOIN TAB2 AS T02 ON                            
                  T01.KEY1=T02.KEY1 AND T01.KEY1=T02.KEY2 
    left join  (SELECT DISTINCT FT1, FT2,  SUM(FT3) AS MENGE from TAB3    
         WHERE FLD8='931' AND FLD14='02' and FLD15='01  order by FT1, FT2 group by FT1, FT2) AS T03 ON
                   T03.FT1=T01.KEY1 and T03.FT2=T01.KEY2         
    WHERE  T01.KEY1='01' and  T01.FLD5='A' AND T02.FLD3>0            
    GROUP BY T01.KEY1, T01.BEZ
    ORDER BY T01.KEY1

    Danke an alle Helfenden

  2. #2
    Registriert seit
    Nov 2012
    Beiträge
    51

    Hochkomma vergessen.

    1.
    Bessere mal
    PHP-Code:
    and FLD15='01 
    auf
    PHP-Code:
    and FLD15='01' 
    aus.

    2.
    Im JOIN wird
    PHP-Code:
    T01.KEY1=T02.KEY2 
    wohl auch auf
    PHP-Code:
    T01.KEY2=T02.KEY2 
    auszubessern sein.

    3.
    Und das "GROUP BY" im Subselect mag er bei mir auch nicht.

    (Diese Liste erhebt keinen Anspruch auf Vollständigkeit. )

  3. #3
    Registriert seit
    Aug 2001
    Beiträge
    2.931
    Zitat Zitat von Anton Gombkötö Beitrag anzeigen
    3.
    Und das "GROUP BY" im Subselect mag er bei mir auch nicht.
    ... zumindest sollte der ORDER BY im Sub-Select entweder weggelassen werden oder zumindest erst nach dem GROUP BY angegeben werden.

    Vor 6.1 waren außerdem ORDER BY-Anweisungen im Sub-Select nicht erlaubt.

    ... und die DISTINCTS kannst Du Dir auch schenken, das ist doppelt gemoppelt.

    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

  4. #4
    Registriert seit
    Apr 2005
    Beiträge
    385
    Danke !!!

    Das Probkem lag tatsächlich am

    Code:
    and FLD15='01  <<-- FEHLENDES ' 
    DANKE

    Allerdings habe jetz jetzt ein left Problem

    T01 = Artikelstamm (Jede Artikel-Nr ist einalig)

    T02 = Paletten Datei (Es gibt bsp. 18. Paletten zu einem Produkt)

    T03 = Lagerbewegungsdatei
    (Menge ist der Vebrauch)

    Jetzt habe ich das Problem, das der Verbrauch multipliziert mit der Anzahl der Paletten ausgeweisen wird!

    Wie bekomme ich es hin, das entweder
    1. Der Vebrauch direkt mit dem Artikelstamm verknüpft wird
    2. Muss ich auch für die Palettendatei ein SubSelect machen?

    Danke

  5. #5
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Hallo,
    da ich auch kein SQL Spezialist bin, und bei den verschatelten SQL-Statements immer auf die Nase falle, fand ich den Artikel von Brigitta bezgl. der UDFs ganz toll, da kann man die Aufgabe auf einzelne Abfragen runterbrechen.

    Ich würde also ein SQL-Statement als UDF machen welches mir nur die Paletten zu einem Artikel anzeigt, ein weiteres welches mir nur den Verbrauch anzeigt und das dann in ein SQL-Statement zusammenbasteln.
    Ist für mich dann übersichtlicher und nachvollziehbarer.

    GG

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.931
    Zitat Zitat von KingofKning Beitrag anzeigen
    Hallo,
    da ich auch kein SQL Spezialist bin, und bei den verschatelten SQL-Statements immer auf nie Nase falle, fand ich den Artikel von Brigitta bezgl. der UDFs ganz toll, da kann man die Aufgabe auf einzelne Abfragen runterbrechen.

    Ich würde also ein SQL-Statement als UDF machen welches mir nur die Paletten zu einem Artikel anzeigt, ein weiteres welches mir nur den Verbrauch anzeigt und das dann in ein SQL-Statement zusammenbasteln.
    Ist für mich dann übersichtlicher und nachvollziehbarer.

    GG
    Danke für das Lob,
    aber ... in diesem Fall machen UD(T)Fs aus Perfomance Gründen keinen Sinn. Darauf hatte ich in dem Artikel auch extra hingewiesen.

    Sinn machen dagegen durch aus Common Table Expressions (CTE), um die Abfrage aufzuteilen. M.E. sind sie leichter zu lesen als verschachtelte Sub-Selects.

    Etwa so:
    Code:
    With a as (Select Fld1, Fld2, Key1, Key2 
                 From Tab01
                 Where Key1 = '01' and Fld5 = 'A'),
    
         b as (Select a.*, x.Fld2 as BFld2, x.Fld3 as BFld3
                 From a Left join Tab02 x on     a.Key1 = x.Key1 
                                             and a.Key2 = x.Key2
                 Where Fld3 > 0),
    
         c as (Select FT1, FT2, Sum(FT3) as Menge
                 From TAB03
                 Where Fld8='931' and Fld15='01'
                 Group By FT1, FT2)
    
    SELECT  b.Fld1, b.Fld2, Count(BFld2), Sum(BFld3), Menge
       FROM b left Outer Join c on     FT1 = KEY1 
                                   and FT2 = KEY2            
    GROUP BY b.Fld1, b.Fld2
    ORDER BY b.Fld1, b.Fld2
    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

  7. #7
    Registriert seit
    Aug 2006
    Beiträge
    2.114
    Manchmal ist Geschwindigkeit nicht alles,
    manchmal ist es schon schön das es funktioniert ;-)

    GG

  8. #8
    Registriert seit
    Apr 2005
    Beiträge
    385
    Hab es jetzt mal gelöst und es scheint zu funktionieren (Werte sind Stichprobenartik korrekt)

    Statement sieht jetz wie folgt aus:

    Code:
    SELECT T01.FLD01 AS "Artikel-Nr", T01.FLD02 AS "Bezeichnung", COALESCE(SUM(T02.ANZPAL), 0) as "Anzahl Paletten", COALESCE(SUM(T02.BEST),0)  as "Bestand",
               COALESCE(SUM(T03.MENGE) , 0) AS "Verbrauch lfd. Jahr",  COALESCE(SUM(T03.MENGE), 0)/(5*WEEK_ISO(CURDATE())) AS  "durchn. Verbrauch pro Tag"                                              
    FROM ARTIKELSTAMM T01                                              
    LEFT JOIN 
    (SELECT  BLD01, BLD02, COUNT(BLD03) AS  ANZPAL, SUM(BLD04) AS BEST FROM PALETTENDATEI     
     WHERE BLD04>0 
     GROUP BY BLD01, BLD02) AS T02  ON                              
                 TS01=BLD01 AND FLD01=BLD02                         
    CROSS  JOIN                                                         
    (SELECT  CLD01, CLD02,  SUM(CLD03) AS MENGE FROM LAGERBEWEGUNGSDATEI      
     WHERE   CLD04='931' AND CLD05='02' AND  CLD06='01'  AND CLD07=CHAR(YEAR(CURRENT DATE))
     GROUP BY CLD01, CLD02 ) AS T03                                     
                                           
    WHERE T01.KEY01='01' AND T01.STAT='A'
    AND KEY01=CLD01 AND FLD01=CLD02  
    GROUP BY T01.FLD01 , T01.FLD02
    ORDER BY T01.FLD01
    Danke an alle die mir bei der Lösungssuche geholfen haben.

Similar Threads

  1. Einfache Abfrage in COBOL/400 mit EXEC SQL
    By AS400-Anfänger in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 27-06-06, 13:18
  2. problem mit eigener sql function
    By Stefan_Sk in forum NEWSboard Programmierung
    Antworten: 8
    Letzter Beitrag: 26-05-06, 16:37
  3. sql abfrage
    By steven_r in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 17-05-06, 15:49
  4. Problem bei Abfrage bei Imbedded SQL
    By cbe in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 08-06-05, 16:21
  5. SQL Abfrage Problem
    By HoScHiE in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 04-10-01, 14:24

Berechtigungen

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