-
SQL Problem
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
-
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:
Code:
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
-
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
-
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.
-
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
-
Statt CTE kann man den "x"-Ausdruck auch direkt
Code:
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:
-
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
-
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....
-
Wenn Du eine View anstatt einer CTE verwenden sollst, warum machst Du dann nicht aus der CTE eine View und verwendest diese?
Birgitta
-
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 ...
-
Zitat von woodstock99
sollte funzen ...
...und Teil Deiner Strategie werden. Logik aus dem Code in die Datenbank zu legen (kombinierte Views) ist ein anerkennenswerter Ansatz.
Similar Threads
-
By iginla in forum IBM i Hauptforum
Antworten: 8
Letzter Beitrag: 31-03-03, 09:59
-
By Günter Majewski in forum IBM i Hauptforum
Antworten: 0
Letzter Beitrag: 07-01-03, 15:10
-
By Tommy in forum IBM i Hauptforum
Antworten: 7
Letzter Beitrag: 16-12-02, 16:43
-
By HoScHiE in forum IBM i Hauptforum
Antworten: 4
Letzter Beitrag: 03-06-02, 13:30
-
By chrisi in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 27-02-02, 08:46
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks