Penso che questo sia quello che stai cercando.
È un po' brutto, ma qui c'è una piccola ripartizione.
Questo blocco ti consente di ottenere un elenco dinamico dei tuoi valori. (Non riesco a ricordare a chi l'ho rubato, ma è fantastico. Senza questo, pivot non è davvero meglio di un grande approccio alla dichiarazione di casi giganti a questo.)
DECLARE @cols AS VARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)
select @cols = STUFF((SELECT distinct ',' +
QUOTENAME(SellerName)
FROM Product_Price
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
, 1, 1, '')
La tua variabile @cols risulta così:
[Amazon],[eBay],[Sears]
Quindi devi creare una stringa dell'intera query:
select @query =
'select piv1.*, tt.sellername from (
select *
from
(select dt, product, SellerName, sum(price) as price from product_price group by dt, product, SellerName) t1
pivot (sum(price) for SellerName in (' + @cols + '))as bob
) piv1
inner join
(select t2.dt,t2.sellername,t1.min_price from
(select dt, min(price) as min_price from product_price group by dt) t1
inner join (select dt,sellername, sum(price) as price from product_price group by dt,sellername) t2 on t1.min_price = t2.price) tt
on piv1.dt = tt.dt
'
La tabella derivata piv1 ti fornisce i valori pivot. La tabella derivata da tt dal nome intelligente ti dà il venditore che ha le vendite minime per ogni giorno. (Te l'avevo detto che era piuttosto brutto.)
E infine, esegui la tua query:
execute(@query)
E ottieni:
DT PRODUCT AMAZON EBAY SEARS SELLERNAME
2012-01-16 AA 40 27 32 eBay
2012-01-17 BC 30 51.4 33.2 Amazon
2012-01-18 DE 11.1 9.4 13.5 eBay
(scusate, non riesco a mettere in fila quel bit).
Penso che se si dispone di uno strumento di reporting in grado di eseguire tabelle incrociate, sarebbe molto più facile farlo lì.