Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWünsch Dir wasWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst SQL Abfrage letztes Datum

Mitglied: rolandggg

rolandggg (Level 1) - Jetzt verbinden

04.04.2019 um 11:33 Uhr, 1468 Aufrufe, 21 Kommentare

Hallo!

Kurze Frage an die Profis.

Ich habe eine SQL Abfrage die folgende Funktion haben soll ich wähle aus der Tabelle Bestellpositionen (Purchasing$Item_4_2 PIT) alle Positionen aus Bestellungen, Joine diese mit der Tabelle $Product_2_1 ART (Teile) und Part$Supplementaryitem_2_4 ZUS (Zusatzpositionen) damit ich die Namen zuordnen kann und dann joine ich noch auf den Bestellkopf Purchasing$Purchasing_4_1 PUR

Ziel wäre folgendes: Ich hätte gerne eine Artikelliste wo ich für jeden Artikel den Preis der letzten Bestellung sehe.

Meine Variante ist zwar recht lustig bringt aber nicht den gewünschten Erfolg. ;-( Da ich die Aggregierungsfunktion noch nicht durchschaut habe!

Hätte da jemand eine Idee für eine Syntax mit der ich das umsetzen kann?

Vielen Dank
Roland


Mein Code:

select
PUR.nummer,
max(PUR.vom) as Datum,
CASE WHEN ART.nummer IS NULL and ZUS.nummer <> '' THEN ZUS.nummer WHEN ZUS.nummer IS NULL and ART.nummer <> '' THEN ART.nummer END AS Artikel_Id,
CASE WHEN ART.such IS NULL and ZUS.such <> '' THEN ZUS.such WHEN ZUS.such IS NULL and ART.such <> '' THEN ART.such END AS Artikel_such,
CASE WHEN ART.name IS NULL and ZUS.name <> '' THEN ZUS.name WHEN ZUS.name IS NULL and ART.name <> '' THEN ART.name END AS Artikel_Bez,
PIT.preis As Preis,
PIT.pehe As Einheit,
PIT.PE As Mengeneinheit
from Purchasing$Item_4_2 PIT (NOLOCK)
left join dbo.Part$Product_2_1 ART ON ART.PK_id = PIT.FK_art
left join dbo.Part$Supplementaryitem_2_4 ZUS ON ZUS.PK_id = PIT.FK_art
left join dbo.Purchasing$Purchasing_4_1 PUR ON PUR.PK_id = PIT.FK_kopf
where PIT.MANDANT_ID = 3 and PUR.vom > 2017 and PUR.ktyp = '(PurchaseOrder)'
GROUP BY PUR.nummer, ART.nummer, ZUS.nummer, ART.such, ZUS.such, ART.name, ZUS.name, PIT.preis, PIT.pehe, PIT.PE
order by Artikel_such,Datum;
Mitglied: ukulele-7
04.04.2019 um 14:15 Uhr
Leider läßt sich nicht immer alles sinnvoll per Aggregat oder Gruppierung erreichen, vor allem weil der Preis den du suchst ja von der Information in einer anderen Spalte, nämlich dem Datum der Bestellung abhängt. Um das zu erreichen gibt es aber eine vielzahl von Lösungen. Ohne jetzt dein ganzes Query umschreiben zu wollen hier mal in "pseudo" Code, zumal du auch nicht genau sagst um welches SQL es sich handelt (vermutlich MSSQL).
In der "einfachsten" Variante gruppierst du erst und joinst dann die Ausgangstabelle nochmal um weitere Spalten zu erhalten die zu den gruppierten Datensätzen passen. Hier kannst du dann frei vom Gruppier- oder Aggregierzwang alles weitere dazu joinen.
Bitte warten ..
Mitglied: rolandggg
04.04.2019 um 15:05 Uhr
Danke für die Antwort!
Das klingt kompliziert, noch dazu weil ich ja nicht in bestellungen den Preis habe sondern in bestellpositionen und die bestellpositionen sind dann mit der Artikeltabelle verknüpft!?

Sorry hab ich vergessen es handelt sich um Microsoft SQL.

lg Roland
Bitte warten ..
Mitglied: ukulele-7
04.04.2019 um 16:05 Uhr
Ist aber eigentlich nicht kompliziert, nur etwas viel Code.

Im Subselect ermittelst du per GROUP BY und max() den letzten Zeitpunkt der Bestellung für den Artikel. Dem können beliebig viele Joins zugrunde liegen, also sollten hier die Tabellen für Bestellungen (für den Zeitpunkt) und Bestellpositionen (für den FK auf den Artikel kombiniert werden.

Im eigentlichen Select (also dem Äußeren) joinst du alles Andere. Auf Basis des Subselects (im Code als "hilfstabelle" benannt) joinst du dann nochmal die Bestellpositionen (für den Preis) des jeweiligen Artikels und leider müssten auch nochmal die Bestellungen gejoint werden um das Datum zu berücksichtigen.
Es gibt noch andere Möglichkeiten, z.B. mit ROW_NUMBER(). Das ginge im wesentlichen so:
Bitte warten ..
Mitglied: rolandggg
04.04.2019 um 20:12 Uhr
Ich bedanke mich vielmals für deine Mühe und die ausführliche Beschreibung!!!!
Ich werde das morgen gleich ausprobieren!

Vielen Dank nochmal und schönen Abend!
lg Roland
Bitte warten ..
Mitglied: rolandggg
05.04.2019 um 12:33 Uhr
Hi!
Ich schon wieder. Bei mir is der Wurm drin! Hab folgenden Code und der gibt ich weiß nicht wieviele Zeilen für den den gleichen Artikel aus:
t ist bei mir die Hilfstabelle. Ich versuche verzweifelt auch die Artikelbezeichnung ART.such hineinzubekommen und die Bestellnummer PUR.nummer (da checkt er gar nix mehr). Hast du noch eine Ahnung was ich da komplett falsch mache?

select
t.MaxDatum,
t.PK_id,
t.such,
t.name,
PIT.preis,
PIT.pehe,
PIT.pe
FROM (
select
max(PUR.vom) as MaxDatum,
ART.PK_id,
ART.such,
ART.name
from Purchasing$Purchasing_4_1 PUR
INNER JOIN Purchasing$Item_4_2 PIT ON PUR.PK_id = PIT.FK_kopf
INNER JOIN Part$Product_2_1 ART ON PIT.FK_art = ART.PK_id
where PIT.MANDANT_ID = 3 and PUR.vom > 2017 and PUR.ktyp = '(PurchaseOrder)'
GROUP BY ART.PK_id, ART.such, ART.name) t
INNER JOIN Purchasing$Purchasing_4_1 PUR
ON PUR.vom = t.MaxDatum
INNER JOIN Purchasing$Item_4_2 PIT
ON t.PK_id = PIT.FK_art
order by t.such
Bitte warten ..
Mitglied: ukulele-7
05.04.2019 um 14:24 Uhr
Da fehlen mir irgendwie noch Join-Conditions im Äußeren Select, da muss das gleiche gelten wie im Subselect. Es ist aber schwer ohne die Daten zu kennen nur aus dem Select etwas abzuleiten.

Versuch es mal bitte mit der Variante mit ROW_NUMBER(), die scheint mir dann doch sinniger bei so vielen Joins. MSSQL unterstützt das eigentlich in jeder Version.
Bitte warten ..
Mitglied: rolandggg
05.04.2019 um 15:04 Uhr
Ok! Danke!
Ich werd mich nächste Woche noch etwas intensiver damit befassen. Zum Wochenende hin mag das Hirn nicht mehr so.

Bin begeistert das einem jemand so hilft!!!!

Schönes WE
Bitte warten ..
Mitglied: rolandggg
08.04.2019 um 08:54 Uhr
Hi!
Habs jetzt nochmal mit dem Code versucht. Was mir scheinbar die Logik durcheinanderbringt sind die unterschiedlichen Preise:
Unten häng ich die Tabelle drann für den Artikel 1.3302.001.6
Hast du noch eine Idee wo ich da blödsinn mache?



select
t.MaxDatum AS Bestelldatum,
t.nummer AS Bestellnummer,
t.PK_id AS ArtikelId,
t.such AS Artikelsuchname,
t.name AS ArtikelBez,
PIT.preis AS Preis,
PIT.pehe AS EH,
PIT.pe AS ME
from (

select
max(PUR.vom) as MaxDatum,
PUR.nummer,
ART.PK_id,
ART.such,
ART.name
from Purchasing$Purchasing_4_1 PUR
INNER JOIN Purchasing$Item_4_2 PIT ON PIT.FK_kopf = PUR.PK_id
INNER JOIN Part$Product_2_1 ART ON ART.PK_id = PIT.FK_art
where PIT.MANDANT_ID = 3 and PUR.vom > 2017 and PUR.ktyp = '(PurchaseOrder)' and ART.MANDANT_ID = 3 and PUR.MANDANT_ID = 3
GROUP BY PUR.nummer,ART.PK_id,ART.such, ART.name
) t
INNER JOIN Purchasing$Purchasing_4_1 PUR ON PUR.vom = T.MaxDatum
INNER JOIN Purchasing$Item_4_2 PIT ON t.PK_id = PIT.FK_art
GROUP BY t.MaxDatum,t.nummer,t.PK_id,t.such,t.name,PIT.preis,PIT.pehe,PIT.pe
order by t.such
abfrage ergebnis - Klicke auf das Bild, um es zu vergrößern
Bitte warten ..
Mitglied: ukulele-7
08.04.2019, aktualisiert um 09:14 Uhr
Was auf jedenfall ein Problem ist ist das Bestelldatum. Da steht nur ein Datum drin, kein Zeitstempel, ergo wird er dir mehrere Preise zu einem Datum liefern. Daher joinst du auch mehrere Datensätze und bekommst unerwartete Ergebnisse.

Nimm besser meine 2te Variante, die ist komfortabler. Hier mal so grob, auch wenn ich nicht weiß was ich da tue:

Bitte warten ..
Mitglied: rolandggg
08.04.2019 um 09:38 Uhr
Hallo!

Vielen Dank nochmal! Scheinbar gibts ein gröberes Problem mit dem PUR.vom (Datum) auch wenn ich einen "einfachen" select mit
max(PUR.vom) und den Rest gruppiere zeigt er trotzdem alle an und nicht den mit dem höchsten Datum.

Leider auch bei deinem letzten Vorschlag. Vielleicht kann ich das Datum irgendwie Konvertieren damit ers checkt!?

lg Roland
Bitte warten ..
Mitglied: ukulele-7
08.04.2019 um 09:55 Uhr
Nein dann ist vermutlich irgendetwas im PARTITION BY falsch, bitte prüfe was der innere Select liefert und passe das ggf. an.

Hier ein Beispiel:
liefert
Bitte warten ..
Mitglied: rolandggg
08.04.2019 um 12:49 Uhr
Ich bin jetzt noch bei der Ursprungsversion weils mir keine Ruhe lässt.
Der innere Select funktioniert einwandfrei (fett markiert). Ich habe jetzt um das Datumproblem zu umgehen auch die höchste Bestellnummer genommen falls es am selben Tag passiert.

Irgendwas passt beim JOIN im äusseren Select nicht aber ich komm nicht drauf.

select
t.MaxDatum AS Bestelldatum,
t.MaxNummer AS Bestellnummer,
t.nummer AS ArtikelId,
t.PK_id AS ArtikelId,
t.such AS Artikelsuchname,
t.name AS ArtikelBez,
PIT.preis AS Preis,
PIT.pehe AS EH,
PIT.pe AS ME
from (

**select
max(PUR.vom) as MaxDatum,
max(PUR.nummer) as MaxNummer,
ART.nummer,
ART.PK_id,
ART.such,
ART.name
from Purchasing$Purchasing_4_1 PUR
INNER JOIN Purchasing$Item_4_2 PIT ON PIT.FK_kopf = PUR.PK_id
INNER JOIN Part$Product_2_1 ART ON ART.PK_id = PIT.FK_art
where PIT.MANDANT_ID = 3 and PUR.vom > '2017-12-31 00:00:00.000' and PUR.ktyp = '(PurchaseOrder)' and ART.MANDANT_ID = 3 and PUR.MANDANT_ID = 3
GROUP BY ART.nummer,ART.PK_id,ART.such, ART.name* *
) t
INNER JOIN Purchasing$Purchasing_4_1 PUR ON t.MaxNummer = PUR.nummer and t.MaxDatum = PUR.vom
INNER JOIN Purchasing$Item_4_2 PIT ON t.PK_id = PIT.FK_art
GROUP BY t.MaxDatum,t.MaxNummer,t.nummer,t.PK_id,t.such,t.name,PIT.preis,PIT.pehe,PIT.pe
order by t.such
Bitte warten ..
Mitglied: ukulele-7
08.04.2019 um 13:30 Uhr
In deinem Screenshot haben die ersten 4 Bestellpositionen schon die selben Daten mit Ausnahme des Preises, ich kann nicht sagen das ich das noch durchschaue.
Bitte warten ..
Mitglied: rolandggg
08.04.2019 um 14:03 Uhr
Ok, dann sind wir schon zu zweit!

Ich werds weiter fieberhaft versuchen!

Danke trotzdem für die Hilfe!

lg Roland
Bitte warten ..
Mitglied: MadMax
09.04.2019 um 20:07 Uhr
Nabend,

was macht Ihr denn da für Spielchen?

Sorry, daß ich da dazwischenfunke, aber ich hab so den Eindruck, Ihr macht das immer komplizierter.

Als erstes solltest Du die Artikel zusammenlesen, die Du in der Liste stehen haben willst. Wenn ich das richtig gesehen habe, dann sind das die bestellten Artikel, welche auch Zusatzpositionen enthalten können. Diese Liste erhältst Du mit:
Dann willst Du noch Infos über den Artikel, nämlich nummer, such und name. Die holst Du Dir über die left joins auf Part$Product_2_1 und Part$Supplementaryitem_2_4 rein. So wie das bei Dir steht, funktioniert das aber nur ordentlich, wenn die PK_id der beiden Tabellen sich nicht überschneiden. Wenn sie sich überschneiden, dann wird bei den entsprechenden Werten nichts angezeigt. Da sollte man besser noch eine Information in Purchasing$Item_4_2 haben, die eindeutig angibt, auf welche Tabelle es sich bezieht. Außerdem kannst Du mit der jetzigen Art, die Daten zu lesen, theoretisch auch gemischte Ergebnisse haben. Wenn nummer in der einen Tabelle und name in der anderen leer ist, dann bekommst Du in einer Zeile die nummer aus einer Tabelle, den name aus der anderen.

Und zum Schluß willst Du noch Preis, Einheit, Nummer und Datum der letzten Bestellung haben. Das bekommst Du mit einer Unterabfrage, in der Du genau diese Bestellposition suchst. Eingebunden wird das mit "outer apply", damit Du in der Unterabfrage auch auf eine vorherige Tabelle zugreifen kannst. Damit es nur einen Datensatz gibt, verwendet man "top (1)". Und damit die Sortierung stimmt ganz normal das "order by". Ich habe jetzt mal die PK_id bei der Sortierung genommen, da könnte man natürlich auch Datum oder sonstwas nehmen. Aber Datum allein ist ja erstmal nicht eindeutig.

Zusammen sieht das dann so aus:
Da ich Deine Tabellen nicht habe natürlich ungetestet.

Gruß, Mad Max
Bitte warten ..
Mitglied: rolandggg
15.04.2019 um 09:59 Uhr
Hallo!
Danke zuerst mal für die Unterstützung.
Ich habs getestet und bekomme einen Haufen Nullwerte bei Preis, Einheit usw. wo es aber eindeutig Bestellung dazu gäbe.

Müsste ich nicht nach dem "inneren Select" p noch einen Join machen?

lg Roland
abfrage - Klicke auf das Bild, um es zu vergrößern
Bitte warten ..
Mitglied: MadMax
LÖSUNG 15.04.2019 um 12:32 Uhr
Ups, sorry, so wie die Artikel ausgewählt sind, existiert ja sicher eine Bestellung. Die Zeilen mit den NULL-Werten sind Artikel von anderen Mandanten, vor 2017 oder nicht "PurchaseOrder", eben die, die in der where-Bedingung in der Unterabfrage ausgeschlossen sind.

Mach mal aus dem "outer apply" ein "cross apply", dann sollte es passen.

Gruß, Mad Max
Bitte warten ..
Mitglied: rolandggg
15.04.2019 um 16:00 Uhr
Ui! Das schaut ja mal gut aus!!!!

Ich bedanke mich vielmals!

Jetzt werd ich mir mal durchlesen was outer und cross apply bedeutet!

Danke nochmal!
Bitte warten ..
Mitglied: ukulele-7
LÖSUNG 15.04.2019 um 16:04 Uhr
Dann lass mal hören ob es tut was es soll. Ich hatte am Wochenende leider noch keine Zeit meinen Code mit Testdaten, wie zugesagt, zu testen.
Bitte warten ..
Mitglied: rolandggg
15.04.2019 um 17:29 Uhr
Ich werd morgen mal bescheid geben!

Dir aber auch herzlichen Dank ukulele!

Ich befürchte ich hab aber sowieso schon wieder ein neues Problem.

Bitte warten ..
Mitglied: rolandggg
18.04.2019 um 16:22 Uhr
Hat funktioniert!

Vielen Dank nochmal an alle für die Hilfe!

lg Roland
Bitte warten ..
Ähnliche Inhalte
Datenbanken
SQL datum kleiner today
gelöst Frage von StarMannDatenbanken8 Kommentare

Hi, habe eine kleine frage. wie kann ich "datum < today and datum is not null" umsetzen? Das war ...

Datenbanken
SQL-Abfrage - DISTINCT - letztes Datum
gelöst Frage von emeriksDatenbanken3 Kommentare

Hi, ich bauche mal Hilfe bei einer SQL-Abfrage. Habe eine Tabelle mit zwei Spalten: "Farbe" und "Datum" Jede Farbe ...

Datenbanken

SQL Abfrage Datum wird in Abfrage falsch angezeigt

gelöst Frage von BlueEyePhoenixDatenbanken5 Kommentare

Hallo Community, ich hab da mal ein Frage zu SQL abfragen. Ich wollte mir eine Abrage über mehrer Tabellen ...

PHP

Datum Rechner

gelöst Frage von michi-ffmPHP6 Kommentare

Hey Leute, evtl kann mir jemand helfen und mir folgenden Skript erklären und sagen wie ich das Jahr dazubekommen ...

Neue Wissensbeiträge
Microsoft
Microsoft Advanced Threat Protection for Linux
Information von Dani vor 1 TagMicrosoft

Microsoft Defender Advanced Threat Protection (MD ATP) support for Linux with kernel version 3.10.0-327 or later, including the following ...

Humor (lol)
! ! Today ist SysAdmin-Day ! !
Information von VGem-e vor 3 TagenHumor (lol)5 Kommentare

Moin, "Happy Birthday" an alle Systemadministratoren, Mausschubser, System-/EDV-Betreuer, SysOps etc!! Siehe auch. Edit (Video hinzugefügt): Gruß VGem-e

Exchange Server
Basic Authentication and Exchange Online
Information von Dani vor 5 TagenExchange Server

Today we are pleased to announce some new changes to Modern Authentication controls in the Microsoft 365 Admin Center, ...

Cloud-Dienste

Wenn die Cloud geklaut (oder einfach nur abgeschaltet) wurde

Information von certifiedit.net vor 8 TagenCloud-Dienste10 Kommentare

Wie war das mit der Reliability und was ist mit dem Datenschutz?

Heiß diskutierte Inhalte
Google Android
Smartphone - Internes Radio auf Bluetooth Lautsprecher abspielen
Frage von emeriksGoogle Android18 Kommentare

Hi, vielleicht kann ja einer von Euch auch sowas beantworten. Ich habe hier ein Samsung Smartphone - S10 Lite. ...

Windows Server
Denselben Port auf verschiedenen Netzwerkkarten nutzen
gelöst Frage von entchenbrotWindows Server17 Kommentare

Hi wir haben einen Server PC mit verschiedenen Netzwerkkarten als Art Gaming-Server und würden gerne ein Spiel in zwei ...

Cloud-Dienste
Cisco 8841 - Enter activation code
Frage von c0d3.r3dCloud-Dienste16 Kommentare

Guten Morgen, ich habe gerade von einem Mitarbeiter den Hinweis bekommen, dass sein Telefon (Cisco 8841) einen Welcome-Screen mit ...

Microsoft Office
Office 2019 Deployment
gelöst Frage von NRG2112Microsoft Office16 Kommentare

Hallo zusammen, ich verzweifel mit Microsofts neuen Office 2019 Setups. Ich versuche jetzt 2 Stunden lang ein Office 2019 ...

Weniger Werbung?
Administrator Magazin
07 | 2020 In der Juli-Ausgabe beleuchtet das IT-Administrator Magazin den Themenschwerpunkt "Monitoring & Support". Darin zeigt die Redaktion unter anderem, wie Sie die Leistung von Terminalservern im Blick behalten und welche Neuerungen das Ticketsystem OTRS 8 mitbringt. Auch die Überwachung von USV-Anlagen darf nicht fehlen. In ...