aximand
Goto Top

Anzeige von Maximalwerten je Datensatz

Hallo,

ich habe ein Problem und komme einfach seit Stunden nicht richtig weiter, da ich selten SQL-Abfragen schreibe.

Es gibt eine Datenbank in der einige Datensätze vorhanden sind, die sich unter anderem durch identisches Startdatum und unterschiedlichem Enddatum als auch BonusStaffelID und BonusTypID unterscheiden:

bild

select BS.BonusStaffelName, BT.BonusTypName, KBS.BonusProzent, KBS.Startdatum, KBS.Enddatum From PBOKundeBonussatz KBS 
left Join PBOBonusStaffeln BS on KBS.BonusStaffelID = BS.BonusStaffelID 
left Join PBOBonusTyp BT on KBS.BonusTypID = BT.BonusTypID where KBS.KontoID = '4711' and KBS.Startdatum <= '30.09.2020' and KBS.aktiv = 0   

Als Ergebnis kommt, von denen ich aber nur die gelb markierten angezeigt bekommen möchte:
ergebnis

Warum nur die gelb markierten:

Weil das Startdatum <= 30.09.2020 ist - das schließt für die Kombination Staffelname / Bonustyp die Zeile 1,2,4,5 ein.
Davon fallen 4 und 5 schon einmal raus weil diese Datensätze mit Startdatum 15.09. und 27.09. älter sind als die beiden mit dem Startdatum 30.09.
Es fällt Zeile 2 raus, weil das EndDatum mit dem 06.10. vor dem 08.10. aus Zeile 1 liegt.

Zelie 3 muss angezeigt werden, weil neue Kombination StaffelName/Bonustyp, ebenso 6 und 7

Also soll das irgendwie wie folgt sein:

KBS.Startdatum <= '30.09.2020' davon aber nur der Datensatz, der im ersten Schritt am nächsten nach unten betrachtet zum 30.09. liegt (das wäre der 30.09.) und im zweiten Schritt, der Datensatz, der dann noch das höchste Enddatum hat (08.10.)
Das ganze sinngemäß auch bei den anderen Kombinationen, so dass für jede Kombination aus Staffelname und BonusTyp nur ein Datensatz angezeigt wird.

Hat da jemand den entscheidenden Hinweis für mich?

Danke und LG

Content-ID: 609187

Url: https://administrator.de/contentid/609187

Ausgedruckt am: 22.11.2024 um 07:11 Uhr

akretschmer
akretschmer 01.10.2020 um 17:51:46 Uhr
Goto Top
Du suchst offenbar eine Aggregation & Gruppierung.
MadMax
MadMax 02.10.2020 um 19:22:49 Uhr
Goto Top
Hallo Aximand,

Deine Datenbank hast Du jetzt nicht verraten, das wäre interessant gewesen.

Wenn ich das richtig verstanden habe, dann suchst Du zu den verschiedenen Kombinationen von BonusStaffel und BonusTyp den letzten KundenBonussatz. Heißt also:
- erst die verschiedenen Kombinationen aus BonusStaffel und BonusTyp suchen
- dann nur den letzten Kundenbonussatz dazu lesen
- und am Ende noch den Namen von BonusStaffel und -Typ holen

In SQL Server sähe das etwa so aus:
select	BS.BonusStaffelName,
	BT.BonusTypName, 
	KBS.BonusProzent, 
	KBS.Startdatum, 
	KBS.Enddatum 
from	(select distinct BonusStaffelID, BonusTypID from PBOKundeBonussatz) b
	cross apply (	select	top (1) *
			from	PBOKundeBonussatz
			where	BonusStaffelID = b.BonusStaffelID and
				BonusTypID = b.BonusTypID and
				KontoID = '4711' and  
				Startdatum <= '30.09.2020' and  
				aktiv = 0
			order by Startdatum desc, Enddatum desc) KBS
	left Join PBOBonusStaffeln BS on b.BonusStaffelID = BS.BonusStaffelID 
	left Join PBOBonusTyp BT on b.BonusTypID = BT.BonusTypID 

Schönes Wochenende.

Gruß Mad Max
Aximand
Aximand 03.10.2020 um 11:33:08 Uhr
Goto Top
Hi Max, ist ein MS SQL Server.

Deine Abfrage muss ich erstmal zerlegen und verstehen. Danke!