Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Confronto prezzo prodotto in sql

Penso che questo sia quello che stai cercando.

SQLFiddle

È 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ì.