Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Comparação de preços de produtos em sql


Acho que é isso que você está procurando.

SQLFiddle

É meio feio, mas aqui está um pequeno detalhamento.

Este bloco permite obter uma lista dinâmica de seus valores. (Não me lembro de quem eu roubei isso, mas é incrível. Sem isso, o pivô realmente não é melhor do que uma grande abordagem de declaração de caso gigante para isso.)
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, '')

Sua variável @cols fica assim:
[Amazon],[eBay],[Sears]

Então você precisa construir uma string de toda a sua consulta:
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
'

A tabela derivada piv1 fornece os valores dinâmicos. A tabela derivada de tt inteligentemente nomeada dá a você o vendedor que tem as vendas mínimas para cada dia. (Eu disse que era meio feio.)

E, finalmente, você executa sua consulta:
execute(@query)

E você obtém:
 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

(desculpe, não é possível fazer esse bit se alinhar).

Eu acho que se você tiver uma ferramenta de relatório que possa fazer crosstabs, isso seria muito mais fácil de fazer lá.