AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Letzter Datensatz ermitteln auf Basis von 3 Feldern

Letzter Datensatz ermitteln auf Basis von 3 Feldern

Ein Thema von Piro · begonnen am 21. Jun 2021 · letzter Beitrag vom 23. Jun 2021
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#1

Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 12:08
Datenbank: MS SQL • Version: 2012 • Zugriff über: ADO
Hi zusammen,

ich bin seid Stunden auf der Suche, um meine Anforderung zu lösen. Ich hoffe hier Tipps und Hilfestellungen zu finden.

Ich habe eine SQL DB Tabelle, in welcher Material-Nummer, das Bewegungsdatum und die Bewegungsfolge abgelegt sind.
Die Bewegungsfolge ist wichtig, um zu erkennen an einem Tag in welcher Reihenfolge die Bewegungen (Zugang oder Abgang) waren.

Ich benötige ein Kennzeichen, welches mir sagt, was die letzte Bewegung zu einer Material-Nummer war.

Hier die Datenbank Daten (sortiert)
Code:
Material-Nr  B-Datum    B-Folge
----------  ----------  ------
111111111   2016-03-11     1   
111111111   2016-03-08     1   
111111111   2016-02-02     1   
111111111   2016-02-17     2    

222222222   2016-09-29     1    
222222222   2016-09-29     2    
222222222   2016-09-29     3    

333333333   2015-01-20     1    
333333333   2021-05-17     1

Nun benötige ich eine Abfrage, welches das KZ entstehen lässt und damit den letzten Bewegungssatz zur Material-Nummer ermittelt in Abhängigkeit des jüngsten B-Datum. Sollte es am jüngsten B-Datum mehrere Bewegungen geben, kennzeichnet die größte B-Folge dann den letzten Bewegungssatz.
Code:
Material-Nr  B-Datum    B-Folge  KZ
----------  ----------  ------   --
111111111   2016-03-11     1     N
111111111   2016-03-08     1     N
111111111   2016-02-02     1     N
111111111   2016-02-17     2     J

222222222   2016-09-29     1     N
222222222   2016-09-29     2     N
222222222   2016-09-29     3     J
 
333333333   2015-01-20     1     N
333333333   2021-05-17     1     J
Danke für alle Tipps und Hinweise, wie ich diese Anfoderung lösen kann.

Sven
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.795 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 12:12
SQL-Code:
select
  top 3 <Feldliste>
from
  <Tabelle>
where
  <Bedingung>
order by
  <Feldliste> desc;
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#3

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 13:50
Hi,

danke für die schnelle Antwort. Der Syntax ist mir klar. Das spannende ist die Bedingung

Ich werde mit left join, die relevanten Daten ermitteln.

Dazu habe ich schon folgende Abfrage.
Code:
select mat_nr, max(b_datum) from mytable group by mat_nr
Mit diese Abfrage bekomme ich das letzte Bewegungsdatum zu einer Material-Nummer. Jetzt muss ich nur noch die Buchungsfolge einbauen.

Denn am letzten Bewegungsdatum können mehrere Bewegungen gewesen sein. Die größte Bewegungsfolge ist dann der letzte Datensatz.
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 13:59
Das ist meine Gesamtabfrage.

Code:
SELECT a.mat_nr
      ,a.b_datum
      ,a.b_folge    
      ,b.kz
  FROM mytable a
  left outer join
   (select max(b_datum) as max_b_datum, mat_nr, 'J' as [kz] from mytable group by mat_nr) as b on a.mat_nr = b.mat_nr and a.b_datum = b.max_b_datum
order by mat_nr, b_datum
Ich muss jetzt nur, wie oben geschrieben, in das select statement, die b_folge hinbekommen.
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#5

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 14:44
Mit meiner aktuellen Lösung sind mehrere Bewegungen am letzten Tag noch ein Problem. Deshalb muss die Folge berücksichtigt werden.

Hier das Beispiel.

Code:
Material-Nr  B-Datum    B-Folge  KZ
----------  ----------  ------   --
222222222   2016-09-29     1     J
222222222   2016-09-29     2     J
222222222   2016-09-29     3     J
Ergebnis soll sein, dass nur in der 3. Zeile ein J steht.

Mir würde schon helfen, wie das SQL Select Statement aussehen muss, um bei den Daten nur den 3. Datensatz zu bekommen.

Danke.
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
2.810 Beiträge
 
Delphi 2009 Professional
 
#6

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 15:42
Das Mittel der Wahl für diese SQL Abfrage wäre eine PARTITION BY Klausel. Die Partition wird aus der mat_nr gebildet und innerhalb der Partition wird dann nach den beiden anderen Spalten sortiert. Der letzte Datensatz der Partition erhält dann das "J" Kennzeichen, die vorigen das "N".

Zum Einstieg:

https://docs.microsoft.com/de-de/sql...l-server-ver15
Michael Justin
  Mit Zitat antworten Zitat
Benutzerbild von Piro
Piro

Registriert seit: 14. Jul 2003
Ort: Flintbek
810 Beiträge
 
Delphi XE2 Professional
 
#7

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 16:23
Das mit OVER klingt interessant aber auch kompliziert.

Zitat:
Mir würde schon helfen, wie das SQL Select Statement aussehen muss, um bei den Daten nur den 3. Datensatz zu bekommen.
Um zu bekommen, benötige ich da auch OVER?
  Mit Zitat antworten Zitat
mjustin

Registriert seit: 14. Apr 2008
2.810 Beiträge
 
Delphi 2009 Professional
 
#8

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 17:13
Das mit OVER klingt interessant aber auch kompliziert.

Zitat:
Mir würde schon helfen, wie das SQL Select Statement aussehen muss, um bei den Daten nur den 3. Datensatz zu bekommen.
Um zu bekommen, benötige ich da auch OVER?
Ja, das OVER ist auf jeden Fall erforderlich, da es die Fensterfunktion definiert. Je nach Anwendungsfall ist das PARTITION BY oder das ORDER BY nicht erforderlich, das ergibt sich aus dem Syntaxdiagramm und in den Beispielen auf der verlinkten Seite - hier sieht man eins ohne PARTITION BY

Code:
SELECT BusinessEntityID, TerritoryID  
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)  
                                            ),1) AS MovingAvg
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)  
                                            ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5 
ORDER BY SalesYear;
Michael Justin

Geändert von mjustin (21. Jun 2021 um 17:22 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
4.797 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 17:38
Moin...
[OT]
Code:
SELECT BusinessEntityID, TerritoryID
   ,DATEPART(yy,ModifiedDate) AS SalesYear
   ,CONVERT(VARCHAR(20),SalesYTD,1) AS SalesYTD
   ,CONVERT(VARCHAR(20),AVG(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS MovingAvg
   ,CONVERT(VARCHAR(20),SUM(SalesYTD) OVER (ORDER BY DATEPART(yy,ModifiedDate)
                                            ),1) AS CumulativeTotal
FROM Sales.SalesPerson
WHERE TerritoryID IS NULL OR TerritoryID < 5 
ORDER BY SalesYear;
Mit sowas habe ich Bauchschmerzen. Wenn man MSSQL bleibt, ok...bei einem Wechsel des DBMS funktioniert das ganze nicht mehr. Deshalb stehe ich auf Standard SQL... (KISS)
[/OT]

Geändert von haentschman (21. Jun 2021 um 17:41 Uhr)
  Mit Zitat antworten Zitat
Jumpy

Registriert seit: 9. Dez 2010
Ort: Mönchengladbach
1.696 Beiträge
 
Delphi 6 Enterprise
 
#10

AW: Letzter Datensatz ermitteln auf Basis von 3 Feldern

  Alt 21. Jun 2021, 17:46
Nicht schön, aber selten:

Code:
SELECT a.mat_nr ,a.b_datum ,a.b_folge    
  case when a.b_folge=b.b_folge then 'J' else 'N' end as KZ
FROM mytable a
LEFT JOIN
  (Select mat_nr,b_datum,max(b_folge) b_folge From Mytable Group By mat_nr, b_datum) b
  ON b.mat_nr=a.mat_nr and b.b_datum=a.b_datum
WHERE
  a.matnr||a.b_datum in (Select mat_nr||max(b_datum) From mytable Group by mat_nr)
ORDER by mat_nr, b_datum
Ralph
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +2. Es ist jetzt 22:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2021, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf