PDA

View Full Version : Problem mit einer SQL-Abfrage



ExAzubi
07-10-13, 16:18
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


QL-Status: 42601
Vendorencode: -104
Nachricht: [SQL0104] Token 01 ungültig. Gültige Token: ) FETCH...


Hier die Abfrage


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

Anton Gombkötö
07-10-13, 16:37
1.
Bessere mal

and FLD15='01
auf

and FLD15='01'
aus.

2.
Im JOIN wird

T01.KEY1=T02.KEY2
wohl auch auf

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. ;) )

B.Hauser
07-10-13, 17:07
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

ExAzubi
08-10-13, 12:22
Danke !!!

Das Probkem lag tatsächlich am



<code style="white-space:nowrap"><code>and FLD15='01 <<-- FEHLENDES ' </code></code>


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

KingofKning
08-10-13, 14:43
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

B.Hauser
08-10-13, 15:50
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:

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

KingofKning
08-10-13, 21:55
Manchmal ist Geschwindigkeit nicht alles,
manchmal ist es schon schön das es funktioniert ;-)

GG

ExAzubi
09-10-13, 08:17
Hab es jetzt mal gelöst und es scheint zu funktionieren (Werte sind Stichprobenartik korrekt)

Statement sieht jetz wie folgt aus:



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.