PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : SQL-Problem (SQL Server 2005)


Expandable
2007-08-02, 15:45:44
Hallo allerseits,

ich stehe gerade voll auf dem Schlauch: Ich habe eine Tabelle, die so aussieht:

ID uniqueidenitifer
productID uniqueidntifier
vendorID uniqueidentifier
price decimal
date datetime

Jeden Tag wird für ein Produkt für jeden Händler ein Preis eingetragen. D.h., ich habe für einen gewissen Tag mehrere Einträge mit der gleichen productID und unterschiedlichen vendorIDs.

Ich möchte nun eine Preis-Historie des Minimalpreises auslesen. Nur: Wie?

SELECT MIN(price) AS price, CAST(CONVERT(VARCHAR(10), date, 111) AS DATETIME) AS date
FROM pe_prices
WHERE (productID = @productID)
GROUP BY CAST(CONVERT(VARCHAR(10), date, 111) AS DATETIME)

Liefert mir für jeden Tag den niedrigsten Preis. Aber ich brauche auch noch die Vendor-ID! Ich kann diese jedoch nicht in's SELECT mit aufnehmen, weil die dazu in der Group-By-Clause sein muss (oder ebenfalls Teil einer aggregate function sein muss). Nur macht mir das das Ergebnis kaputt (falls mehrere Händler den gleich-niedrigsten Preis haben, werden mehrere Rows zurückgeliefert - es soll aber auch dann nur eine Row geliefert werden, mit egal welchem Händler).

Kann mir jemand weiterhelfen? Wo ist mein Denkfehler?

Danke,
- Expandable

Fruli-Tier
2007-08-02, 17:48:30
SELECT TOP 1 MIN(price)...
...liefert Dir nur den ersten aus einer Reihe von Treffern. Damit kannst Du also die Vendor-ID mit ins SELECT und GROUP BY aufnehmen.

Expandable
2007-08-03, 07:19:25
Danke, aber das ist nicht ganz das, was ich suche - dann wird ja nur noch eine einzige Zeile zurückgeliefert.

Ich habe also z.B. folgende Daten (die mit <-- markierten Zeilen sollen zurückgeliefert werden)

(ID, productID, vendorID, price, date)
1 1 1 33,33 1.8.07 <--
2 1 2 33,33 1.8.07
3 1 3 22,22 2.8.07 <--
4 1 1 33,33 2.8.07
5 1 1 10,00 3.8.07 <--
6 1 2 11,11 3.8.07
7 1 3 12,12 3.8.07

Gast
2007-08-03, 12:37:47
Geht vielleicht select distinct... ?

Fruli-Tier
2007-08-03, 16:34:37
Je öfter ich Deinen Beitrag lese, um so weniger verstehe ich was Du genau erwartest.

Was meinst Du mit...
Ich möchte nun eine Preis-Historie des Minimalpreises auslesen.Welche Daten sollen denn angezeigt werden? Welche Einschränkung soll genau herrschen?

Ich bin jetzt echt ein wenig verwirrt :confused:.

Marcel
2007-08-03, 20:28:21
Hilft Dir das hier weiter?
Vorab eine Warnung: Von der von Dir kopierten Query abgesehen ist das ein Konstrukt, das so zumindestens unter DB2 funktioneren müsste.


with bello (produkt, datum, preis)
as (SELECT @productID as produkt,
CAST(CONVERT(VARCHAR(10), date, 111) AS DATETIME) AS datum,
MIN(price) AS preis
FROM pe_prices
WHERE (productID = @productID)
GROUP BY CAST(CONVERT(VARCHAR(10), date, 111) AS DATETIME)
)
select pe_prices.vendorID, bello.produkt, bello.datum, bello.preis
from pe_prices, bello
where pe_prices.productID = bello.produkt
and pe_prices.date = bello.datum
and pe_prices.price = bello.preis



Da ich das jetzt aber nicht prüfen konnte, kann da durchaus ein Denkfehler drin sein.