Wer ist SQL-Syntax Spezialist und kann helfen?

28/09/2007 - 22:16 von Stefan Theobald | Report spam
Hallo,

ich komme einfach mit dem T-SQL nicht zurecht, da es mir kein FIRST / LAST
bietet.
Alle Versuche es wie in Newsgroups zu umgehen, ist bisher fehlgeschlagen.

Ich müsste aktuell neben unten aufgeführtem Beispiel eine Abfrage (über ODBC
auf eine Progress Datenbank) umsetzen, die auch wieder FIRST / LAST
benötigt.
Wer ist Spezialist im SQL / T-SQL und kann helfen?

Ich habe aber noch ein Problem mit einer SQL Abfrage, die ich einfach nicht
für SQL-Server 2005 hinbekomme, da es im SQL-Server nicht den Befehl FIRST
gibt.

Unter ACCESS liefert die Abfrage das richtige Ergebnis, aber nicht unter
SQL-Server 2005. Und die SQL-Server-Abfrage-Syntax bràuchte ich für in mein
VB Programm einzubauen.

Haben Sie vielleicht eine Idee? - Oder gibt es ein Future-Pack, das den
FIRST-Befehl in SQL-Server integriert? Alles suchen im Internet und Posting
in Newsgroups war bis jetzt erfolglos.

Beispiel Datensàtze in der DB (Normal gehören noch Adressen in den
Ausgabesatz, diese aber der Übersichtlichkeit halber weggelassen):



Übergeben | Lieferschein | NVE_Nummer | Gewicht



1 4711 00340061750000956897 132

1 4712 00340061750000956897 68

1 888888 00340061750000956898 500

1 999999 00340061750000956898 333



ACCESS das funktioniert:



SELECT First(dbo_Sendungen.an_externe_Schnittstelle_uebergeben) AS
übergeben, First(dbo_Sendungen.lBeleg) AS Lieferschein,
dbo_Sendungen.sVersNr AS NVE_Nummer, First(dbo_Sendungen.dVersGew) AS
Gewicht

FROM dbo_Sendungen

WHERE (((dbo_Sendungen.lSeqNr) Not In (SELECT lSeqNrSend FROM
dbo_SammelEasyLog)) AND ((dbo_Sendungen.bStorno)=0) AND
((dbo_Sendungen.uebergeben_an_externe_Schnittstelle)=0) AND
((dbo_Sendungen.qVersDatum) Between #1/1/2007# And #12/31/2007#) AND
((dbo_Sendungen.lMandant)0) AND ((dbo_Sendungen.sVersBedi)="hog") AND
((dbo_Sendungen.sVersArt)="54"))

GROUP BY dbo_Sendungen.sVersNr

ORDER BY First(dbo_Sendungen.lBeleg);

Abfrage liefert:


Test2

übergeben
Lieferschein
NVE_Nummer
Gewicht

-1
4711
00340061750000956897
132

-1
888888
00340061750000956898
500






SQL-Server was nicht funktioniert:



SELECT an_externe_Schnittstelle_uebergeben AS übergeben, MIN(lBeleg) AS
Lieferschein, sVersNr AS NVE_Nummer, MIN(dVersGew) AS Gewicht,
ROW_NUMBER() OVER (ORDER BY min(lSeqNr)) AS Zeilennummer

FROM Sendungen

WHERE (lSeqNr NOT IN

(SELECT lSeqNrSend

FROM SammelEasyLog)) AND (bStorno = 0)
AND (uebergeben_an_externe_Schnittstelle = 0) AND (qVersDatum BETWEEN
CONVERT(DATETIME,

'2007-01-01 00:00:00', 102) AND CONVERT(DATETIME,
'2007-12-31 00:00:00', 102)) AND (lMandant = 100) AND (sVersBedi = 'hog')
AND (sVersArt = '54')

GROUP BY sVersNr, an_externe_Schnittstelle_uebergeben

ORDER BY min(lBeleg)


Abfrage liefert:


Übergeben | Lieferschein | NVE_Nummer | Gewicht | Zeilennummer

1 4711 00340061750000956897 68 1

1 888888 00340061750000956898 333 2



Dies sieht nur auf den ersten Blick richtig aus - in Wirklichkeit wird jetzt
auch von den Gewichten der kleinste Wert genommen, und nicht der zur
Datenzeile dazugehörige richtige Wert genommen!!!!

Wie aus den Beispieldatensàtzen ersichtlich müsste bei LS 4711 123gr als
Gewicht kommen!!!





Gruß
Stefan
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
28/09/2007 - 23:18 | Warnen spam
Hallo Stefan,

"Stefan Theobald" schrieb:

ich komme einfach mit dem T-SQL nicht zurecht, da es mir kein FIRST / LAST bietet.



Braucht kein mensch :)

Alle Versuche es wie in Newsgroups zu umgehen, ist bisher fehlgeschlagen.



Vorab muss ich gestehen, dass ich nur die Hàlfte von dem verstanden hab, was
Du geschrieben hast. Dennoch denke ich, dass das folgende SQL Statement das
korrekte Ergebnis liefern sollte (zumindest für deinen aufgeführten Testfall)

SELECT Uebergeben, Lieferschein, NVE_Nummer, Gewicht
FROM Versand a
WHERE Lieferschein IN
(
SELECT MIN(Lieferschein) AS Col1
FROM Versand b
GROUP BY NVE_Nummer
)

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen