Posts
337
Comments
125
Trackbacks
5
SQL-Aufgabe: aktuelle Preise ermitteln

Zu einem Artikel gibt es zu verschiedenen Monaten verschiedene Preise. Die Artikeldaten stehen in der Tabelle Artikel, die verschiedenen Preise in der Tabelle Artikelpreise.

Mit dem folgenden Select lassen sich die heute gültigen Preise ermitteln:

DECLARE @PriceDate AS DATETIME
SET @PriceDate = GETDATE()

SELECT * FROM Artikel
INNER JOIN Artikelpreise ON Artikelpreise.ArtikelGUID=Artikel.GUID
WHERE

(
-- Get the current Entry
Artikelpreise.ValidFrom=
  (CASE WHEN
    (SELECT TOP 1 ValidFrom FROM Artikelpreise
    WHERE ValidFrom<=@PriceDate
    AND Artikelpreise.ArtikelGUID=Artikel.GUID
    ORDER BY ValidFrom DESC) IS NULL
THEN
-- There is only (maybe) a valid Price in the Future. Take it.
    (SELECT TOP 1 ValidFrom FROM Artikelpreise
    WHERE Artikelpreise.ArtikelGUID=Artikel.GUID
    ORDER BY ValidFrom DESC)
ELSE
-- Take the current found Price
    (SELECT TOP 1 ValidFrom FROM Artikelpreise
    WHERE ValidFrom<=@PriceDate
    AND Artikelpreise.ArtikelGUID=Artikel.GUID
    ORDER BY ValidFrom DESC)
END)
-- or no Price at all has been found
OR Artikelpreise.ValidFrom IS NULL
)

posted on Thursday, May 08, 2008 8:41 AM Print
Comments
Gravatar
# re: SQL-Aufgabe: aktuelle Preise ermitteln
BLOB
7/10/2009 10:27 AM
Hallo,

ich bin zufällig über diesen Artikel gestolpert als ich nach einer Möglichkeit gesucht habe aktuelle Preise aus einer Tabelle zu lesen. Ich muss sagen dein SQL-Statement ist so wie ich SQL hasse: unübersichtlich, unverständlich und wenn das Statement mit "SELECT * FROM" anfängt dann schüttelt es mich schon.

ich hab mir dein SQL Statement kopiert und an meine Tabelle angepasst aber irgendwie bin ich nicht so recht glücklich geworden. Also hab ichs noch mal ganz von Anfang an hergeleitet:

Als erstes brauche ich jeden Artikel ein mal:

SELECT DISTINCT a.Name
FROM Artikel a

Dann wird das ganze mit der Preistabelle verknüpft aber ich will aus der Preistabelle jeweils nur das aktuellste Datum und den Preis:

SELECT DISTINCT a.Name, b.ValidFrom, b.Price
FROM Artikel A
INNER JOIN Artikelpreise ON a.ArtikelGUID = b.ArtikelGUID AND b.ValidFrom = ( SELECT MAX(c.ValidFrom) FROM Artikelpreise c where b.ArtikelGUID = c.ArtikelGUID );

Wenn man jetzt noch das Problem hat, das auch zukünftige Preise in der Tabelle Artikelpreise stehen dann packt man noch die zusätzliche Bedingung "and c.ValidFrom < GETDATE()" mit in die Unterabfrage.

PS: Das Kommentarfeld ist irgendwie recht klein geraten.
Gravatar
# re: SQL-Aufgabe: aktuelle Preise ermitteln
BLOB
7/10/2009 10:30 AM
ARGH ich hab noch das "b" vergessen: Es muss natürlich heissen "... INNER JOIN Artikelpreise b ON a.ArtikelGUID..."
Gravatar
# re: SQL-Aufgabe: aktuelle Preise ermitteln
Christian
1/25/2010 3:33 PM
Danke für Deinen Vorschlag!

Post Comment

Title *
Name *
Email
Url
Comment *  
Please add 5 and 7 and type the answer here: