Mehr brandheiße Inhalte
zur Gruppe
Handjob
2859 Mitglieder
zum Thema
Was hilft euch beim Einschlafen?63
Aktuell habe ich das Problem, nicht schlafen zu können.
Das Thema ist für dich interessant? Jetzt JOYclub entdecken

Überregional: SQL-Problem ...

**********t_OWL Mann
802 Beiträge
Themenersteller 
Überregional: SQL-Problem ...
Guten Morgen,

ich sitze gerade wie dumm vor einer SQL Abfrage. Hintergrund: Es sollen ein paar Spalten aus einer Tabelle ausgegeben werden, wobei einige bereits mit CAST und REPLACE umgemodelt werden. Nun habe ich das spezifische Problem, dass ich von mehreren bis auf eine Versionsnummer identische Zeilen nur die mit der höchsten Versionsnummer haben will.
Beispiel:
Nummer Zeile Version Artikel Menge
4711 1000 1 abc 5
4711 1000 2 abc 2
4711 1000 3 def 3

Es KANN mehrere Versionen geben, muss es aber nicht. Ausgegeben soll hier werden die Zeile mit der Version 3. Google hilft mir gerade auch nicht, vielleicht gibt es hier ja einen Spezialisten.
*****ose Frau
79 Beiträge
Du musst das Maximum ermitteln, mit der Funktion MAX(Spaltenname) AS alias
z.b. SELECT MAX(VERSIONSNUMMER) AS V_NR FROM xxx
Und dann holst Du Dir quasi dieses V_NR
**********t_OWL Mann
802 Beiträge
Themenersteller 
Ja, das wäre schön, wenn das so einfach wäre .... dafür müsste ich aber dann wohl alle 24 Spalten, die ich holen will in eine Aggregatfunktion aufnehmen, oder? Und wie ist das dann mit CASE WHEN ELSE Funktionen?
******h15 Paar
2.818 Beiträge
Hi,
ich arbeite mit Sqlite, aber weiß, es verhält sich ähnlich. Wenn du sowieso nur 24 Spalten hast, wieso nicht...:

ORDER BY versionsnummer ASC

Du kannst auch mehrere ORDER BYs verwenden, also anhand mehrerer Faktoren sortieren.
Die Ergebnisse danach mit [hier beliebige Programmiersprache einsetzen] weiter verarbeiten.

Grüße,
Sie von Fernweh
**********t_OWL Mann
802 Beiträge
Themenersteller 
Zitat von ******h15:
Hi,
ich arbeite mit Sqlite, aber weiß, es verhält sich ähnlich. Wenn du sowieso nur 24 Spalten hast, wieso nicht...:

ORDER BY versionsnummer ASC

Du kannst auch mehrere ORDER BYs verwenden, also anhand mehrerer Faktoren sortieren.
Die Ergebnisse danach mit [hier beliebige Programmiersprache einsetzen] weiter verarbeiten.

Grüße,
Sie von Fernweh

Dann habe ich im Ergebnisset aber wieder alle Zeilen, dafür sortiert. Vielleicht habe ich auch nicht genau genug formuliert: Ich habe eine Tabelle mit Einkaufszeilen. Wenn ich an den Einkaufszeilen in der Applikation nie etwas geändert habe, habe ich nur einen Satz pro Bestellnummer und Zeilennummer, mit der Version 1. Sobald ich irgendetwas ändere, werden die Zeilen, die geändert worden sind, mit Version 2 erneut gespeichert, usw. Gültig ist immer die Zeile mit der höchsten Versionsnummer, und nur die sollen ausgegeben werden.
Meine Eingebung gerade ist "das muss mit ins SELECT in die WHERE Bedingung" - so was wie

SELECT Bestellnummer, Zeilennummer, Artikelnummer FROM Bestellzeilen1 WHERE Version = (SELECT MAX(Versionsnummer) FROM Bestellzeilen2 where Bestellnummer = Bestellzeilen1Bestellnummer AND Zeilennummer =Bestellzeilen1.Zeilennummer)

Ich kriegs aber gerade so gar nicht "aufs Papier" .... *aua* *nachdenk* *gruebel*
**********t_OWL Mann
802 Beiträge
Themenersteller 
Nachtrag: Ich glaub ich habs - das scheint zu funktionieren:

SELECT DISTINCT
CASE WHEN EKKopf.[Document Type] = 1 THEN 'Bestellung' WHEN EKKopf.[Document Type] = 4 THEN 'Rahmen' END AS Typ, EKKopf.[Order Date] AS [PO-Datum], EKKopf.No_ AS [PO-Nummer],
EKZeile.[Line No_] AS Bestellposition, CASE WHEN EKKopf.[Document Type] = 1 THEN 'NB' WHEN EKKopf.[Document Type] = 4 THEN 'AB' END AS Belegart, EKZeile.[Version No_] AS Version,
EKZeile.[Blanket Order No_] AS Kontraktnummer, Item.[Item Category Code] AS Warengruppennummer, ICat.Description AS Warengruppenbezeichnung, Item.[Product Group Code] AS Warenuntergruppennummer,
PG.Description AS Warenuntergruppenbezeichnung, EKZeile.No_ AS Artikelnummer, EKZeile.Description AS Artikelbezeichnung, REPLACE(CAST(EKZeile.Quantity AS varchar), '.', ',') AS Bestellmenge,
EKZeile.[Unit of Measure Code] AS Bestellmengeneinheit, EKZeile.[Unit of Measure] AS Bestellmengenbezeichnung, REPLACE(CAST(EKZeile.[Direct Unit Cost] AS varchar(50)), '.', ',') AS Preis,
REPLACE(CAST(EKZeile.[Line Amount] AS varchar(50)), '.', ',') AS Gesamtpreis, CASE WHEN EKKopf.[Currency Code] = '' THEN 'EUR' ELSE EKKopf.[Currency Code] END AS Währung,
EKKopf.[Payment Terms Code] AS [Zahlungsbdingungen Schlüssel], ZBed.Description AS [Zahlungsbedingung Bezeichnung], EKKopf.[Purchaser Code] AS [Einkäufer Code], EKKopf.[Buy-from Vendor No_] AS Kreditorennummer,
EKKopf.[Buy-from Vendor Name] AS Kreditorenbezeichnung
FROM [Meine Firma$Product Group] AS PG INNER JOIN
[Meine Firma$Item Category] AS ICat ON PG.[Item Category Code] = ICat.Code LEFT OUTER JOIN
[Meine Firma$Item] AS Item INNER JOIN
[Meine Firma$Purchase Line Archive] AS EKZeile ON Item.No_ = EKZeile.No_ ON PG.Code = Item.[Product Group Code] AND ICat.Code = Item.[Item Category Code] LEFT OUTER JOIN
[Meine Firma$Purchase Header Archive] AS EKKopf INNER JOIN
[Meine Firma$Payment Terms] AS ZBed ON EKKopf.[Payment Terms Code] = ZBed.Code ON EKZeile.[Document Type] = EKKopf.[Document Type] AND EKZeile.[Document No_] = EKKopf.No_
WHERE (EKKopf.[Order Date] BETWEEN CONVERT(DATETIME, '2019-01-01 00:00:00', 102) AND CONVERT(DATETIME, '2022-12-31 00:00:00', 102)) AND (EKKopf.[Document Type] = 1 OR
EKKopf.[Document Type] = 4) and EKZeile.[Version No_] = (select max(EK2.[Version No_]) FROM [Meine Firma$Purchase Line Archive] AS EK2 WHERE EK2.[Document No_] = EKZeile.[Document No_] and EK2.[Line No_] = EKZeile.[Line No_])

ORDER BY [PO-Nummer]

******h15 Paar
2.818 Beiträge
Wieso nicht das MAX direkt ins SELECT? *happy*

SELECT MAX(versionsnummer), bestellnummer, zeilennummer, art-nummer FROM tabellenname [plus evtl. where / group by / whatever]...?

Edit: Urgh, zu langsam 😊
**********t_OWL Mann
802 Beiträge
Themenersteller 
Eben wegen dem Ellenlangen "Group By". Je mehr Spalten ich benötige umso unübersichtlier wird das, finde ich. Oder hab ich einen Denkfehler?
******h15 Paar
2.818 Beiträge
Du kannst die Ergebnisse begrenzen anhand der Funktion LIMIT.

Beispiel:
SELECT a FROM b WHERE c=? LIMIT 1

Gibt nur ein Ergebnis aus.
Vorher ein ORDER BY, um zB. nur das größte auszugeben, sollte auch funktionieren.
*******o65 Mann
2.264 Beiträge
Zitat von **********t_OWL:
Zitat von ******h15:
Hi,
ich arbeite mit Sqlite, aber weiß, es verhält sich ähnlich. Wenn du sowieso nur 24 Spalten hast, wieso nicht...:

ORDER BY versionsnummer ASC

Du kannst auch mehrere ORDER BYs verwenden, also anhand mehrerer Faktoren sortieren.
Die Ergebnisse danach mit [hier beliebige Programmiersprache einsetzen] weiter verarbeiten.

Grüße,
Sie von Fernweh

Dann habe ich im Ergebnisset aber wieder alle Zeilen, dafür sortiert.

Wenn Du nach Versionsnummer mit DESC sortierst und die Ausgabe mit Limit 1 begrenzt, hast Du die Zeile, die Du suchst.
**********t_OWL Mann
802 Beiträge
Themenersteller 
Zitat von ******h15:
Du kannst die Ergebnisse begrenzen anhand der Funktion LIMIT.

Beispiel:
SELECT a FROM b WHERE c=? LIMIT 1

Gibt nur ein Ergebnis aus.
Vorher ein ORDER BY, um zB. nur das größte auszugeben, sollte auch funktionieren.

Ah - muss ich mal probieren, danke.
**********berer Mann
7.339 Beiträge
Zitat von *******o65:
Zitat von **********t_OWL:
Zitat von ******h15:
Hi,
ich arbeite mit Sqlite, aber weiß, es verhält sich ähnlich. Wenn du sowieso nur 24 Spalten hast, wieso nicht...:

ORDER BY versionsnummer ASC

Du kannst auch mehrere ORDER BYs verwenden, also anhand mehrerer Faktoren sortieren.
Die Ergebnisse danach mit [hier beliebige Programmiersprache einsetzen] weiter verarbeiten.

Grüße,
Sie von Fernweh

Dann habe ich im Ergebnisset aber wieder alle Zeilen, dafür sortiert.

Wenn Du nach Versionsnummer mit DESC sortierst und die Ausgabe mit Limit 1 begrenzt, hast Du die Zeile, die Du suchst.

Aber nur eine Zeile. Wenn ich den TE richtig verstehe, kann es aber mehrere Zeilen mit der höchsten Versionsnummer geben, eben mehrere Artikel. Er möchte aber alle Zeilen mit der höchsten Versionsnummer, korrekt? Das geht meiner Ansicht nach nicht mit einer einfachen absteigenden Sortierung und dem Limit, dann nur die erste Zeile auszugeben. Mit MAX hätte ich es auch umgesetzt.
******h15 Paar
2.818 Beiträge
Ich bin keine ausgebildete ITlerin, sondern nur ambitionierte Hobby-Dev, daher alles ohne Gewähr.
Würde je nach Zweck wahrscheinlich SQL nur grob vorsortieren lassen und die genauen Details dann in Python, oder welche Sprache auch immer genutzt wird, definieren (weil ich mich dahingehend flexibler fühle..? 🤔😅).

Der Integer-Wert im LIMIT ist variabel, man kann auch LIMIT 5 angeben, beispielsweise.
**********t_OWL Mann
802 Beiträge
Themenersteller 
Also das mit MAX in der WHERE-Klausel hat funktioniert - der Kollege im Einkauf ist froh, und ich krieg wieder Kekse *g*
******h15 Paar
2.818 Beiträge
Kekse! Yay!
*muffin*
*******uru Mann
354 Beiträge
Ja klar. Kekse
Wenn ich jedesmal wenn ich einen User glücklich gemacht habe auch nur 1 Keks bekommen habe könnte ich ins Büro rollen.
Mir wäre lieber mein Chef würde den Keks durch Euro ersetzen.
Auch ITler sind Menschen die Nahrung, Wohnung, Kleidung und Arbeitsspeicher brauchen.
Endlich faire Bezahlung für faire Arbeit, das wäre echt geil.
btw. Was verdient ein Webmaster, Frontend DEv, etc.... bei Joy ?
******h15 Paar
2.818 Beiträge
@*****uru dass du mit deiner Entlohnung unzufrieden bist, ist schade, was ich jedoch nicht verstehe: wie genau hängt das mit dem Thread hier zusammen und wer hier ist ITler bei JC? 🤔😅

Der TE klang nicht danach, als wären die Kekse seine generelle Bezahlung, daher hab ich mich mit ihm über das (vermutliche) nette Dankeschön vom Kollegen gefreut. 🤷🏼‍♀️
*******uru Mann
354 Beiträge
War ja auch ironisch/lustig gemeint. Und ich bin ITler seit knapp 40 Jahren.
Wenigstens hat er etwas Anerkennung für seine Arbeit bekommen, bei uns in Schwaben heisst es Ned gmotzt isch globt gnuag. *smile*
******h15 Paar
2.818 Beiträge
Ja, die ersten beiden Sätze hatte ich auch so verstanden, ansonsten Fragezeichen in meinem Kopf. Sorry 😂

Schwobasäckl *nase*
Anmelden und mitreden
Du willst mitdiskutieren?
Werde kostenlos Mitglied, um mit anderen über heiße Themen zu diskutieren oder deine eigene Frage zu stellen.