PDA

View Full Version : SQL Problem



Seiten : [1] 2

woodstock99
22-02-21, 16:50
Hallo zusammen

ich habe folgende Tabelle

Mark Nummer Num2 VKDAT Beleg POS Zeile
-----------------------------------------------------
X 310000006 90080 20210209 4900030919 0002 1
X 310000006 90080 20210209 4900030919 0001 2
_ 310000006 90080 20201102 4900026071 0002 3
X 310000006 90080 20201102 4900026071 0001 4
X 310000006 90080 20201102 4900026058 0002 5
X 310000006 90080 20201102 4900026058 0001 6
_ 310000006 90080 20190826 4900002810 0002 7
_ 310000006 90080 20190826 4900002810 0001 8
X 310000006 90080 20190823 4900002762 0004 9
_ 310000006 90080 20190823 4900002762 0003 10
X 310000006 90080 20190823 4900002762 0002 11
_ 310000006 90080 20190823 4900002762 0001 12
_ 310000006 90080 20190815 4900002531 0001 13
X 310000006 90082 20190815 4900002531 0001 14
_ 310000006 90082 20190815 4900002531 0001 15
X 310000007 90081 20190815 4900002531 0001 16

Ich soll nun mittels SQl ermitteln wann eine Nummer + Num2 ein X erhält und wann nicht .
Die erste Spalte repräsentiert ab welchen Datum eine Nummer ein X erhält .


Beispiel Abfrage. Welchen Wert hat die Spalte Mark bei der Nummer 310000006 Num2 = 90080 am 20201115 . Hier sollte ein _ zuückgegeben werden weil der letzte Eintrag davor ein _ hatte -> Zeile 3.

Frage ich den 20190823 ab sollte ein X zurückkommen weil der gösste Eintrag an diesem Tag Pos 4 ein X hatte ..

Frage ich den 20190828 ab sollte ein _ zurückkommen weil der letzte Eintag davor ein _ hatte -> Zeile 7 ..

Die letzte Spalte ist nicht in der Datei vorhanden (Zeile)
Weiss da jemand ein gutes SQL ?
Gruss

B.Hauser
22-02-21, 17:21
Du must in 2 Schritten vorgehen:
Zunächst musst Du das höchste (numerische) Datum ermitteln, das kleiner oder gleich dem eingegebenen Datum ist.
Dann verknüpfst Du das Ergebnis mit der Tabelle und ermittelst für die höchste Position den Wert in Mark.
Etwa so:

With x as (Select Nummer, Num2, Max(VKDAT) MaxVkDat
from YourTable
Where Nummer = 310000006
and Num2 = 90080
and VKDat <= 20190828
Group By Nummer, Num2)
Select Mark from x join yourTable y on x.Nummer = y.Nummer
and x.Num2 = y.Num2
and VKDat = MaxVkdat
Order By Zeile Desc Limit 1;

Birgitta

woodstock99
22-02-21, 18:44
Danke für den Beitrag . Ist irgendwie verloren gegangen in meinem ersten Posting :( . Keine CTE's und kein Select top 1 etc .. Das macht es ja so schwierig . Es sollte zum schluss mit
select MARk from Table where on x.Nummer = y.Nummer and x.Num2 = y.Num2
and x.datum <= VKDAT zugegriffen werden können

B.Hauser
22-02-21, 18:54
Was darfst Du denn dann überhaupt verwenden?
Ich würde empfehlen ein Programm (mit native I/O) zu schreiben, dann brauchst Du überhaupt kein SQL.

Andreas_Prouza
22-02-21, 19:34
Darf es denn Subselects sein?
Dann könntest du mit einem Subselect alle Sätze >= deinem Datum, das dann nach POS absteigend (DESC) sortieren und davon den ersten via Fetch First Row ermitteln.
Dann hast du auch dein X oder _
Falls eben nur kein CTE erlaubt ist aber ein Subselect schon ... warum auch immer es solche Vorgaben gibt.

lg Andreas

Fuerchau
22-02-21, 20:04
Statt CTE kann man den "x"-Ausdruck auch direkt


Select Mark from
(Select Nummer, Num2, Max(VKDAT) MaxVkDat
from YourTable
Where Nummer = 310000006
and Num2 = 90080
and VKDat <= 20190828
Group By Nummer, Num2
) x
join yourTable y on x.Nummer = y.Nummer
and x.Num2 = y.Num2
and VKDat = MaxVkdat
Order By Zeile Desc
fetch first 1 rows only

kodieren:

woodstock99
22-02-21, 20:23
wenn das leben normal laufen würde hätte ich es so gelöst

with blabla as (
SELECT nummer,num2, vkdat, max(UMZST) as aaa FROM table
group by nummer,num2, vkdat
order by nummer,num2, vkdat )

select top 1 aaa from test where nummer=parmnummer and num2=parmnum2 and vkdat <= parmvkdat
order by nummer desc,num2 desc , vkdat desc

und fertig wär die lutzi . Aber das Leben ist nicht normal .. das ganze muss in views und zwar alles getrennt . cte und first top soll nicht verwendet werden

KingofKning
23-02-21, 06:36
Vielleicht drückst Du dem jenigen der solche Vorgaben macht mal einen Abakus in die Hand. Die Russen rechnen noch heute gerne damit.
Alternativ die Firma wechseln und zu einem vernünftigen Laden gehen. Soll es noch geben, wenn leider auch sehr wenige....

B.Hauser
23-02-21, 07:03
Wenn Du eine View anstatt einer CTE verwenden sollst, warum machst Du dann nicht aus der CTE eine View und verwendest diese?

Birgitta

woodstock99
23-02-21, 08:09
glaub ich machs so ..
view 1
SELECT nummer,num2, vkdat, max(UMZST) as umzst FROM table
group by nummer,num2, vkdat
order by nummer,num2, vkdat )

view 2
select nummer,num2,Max(vkdat) , max(umzst)from view1
group by nummer, num2

select UMZST from view2 where nummer='000000000310000006' and num2='9000000080' and VKDAT <= '20201202'

sollte funzen ...