sql >> Base de Datos >  >> RDS >> Sqlserver

Comparación de precios de productos en sql

Creo que esto es lo que estás buscando.

SQLFiddle

Es un poco feo, pero aquí hay un pequeño desglose.

Este bloque le permite obtener una lista dinámica de sus valores. (No puedo recordar a quién le robé esto, pero es increíble. Sin esto, Pivot realmente no es mejor que un gran enfoque de declaración de caso gigante para esto).

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, '')

Tu variable @cols sale así:

[Amazon],[eBay],[Sears]

Luego, debe crear una cadena de su consulta completa:

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 tabla derivada de piv1 le proporciona los valores pivotados. La tabla derivada de tt ingeniosamente nombrada le muestra al vendedor que tiene las ventas mínimas para cada día. (Le dije que era un poco feo).

Y finalmente, ejecutas tu consulta:

execute(@query)

Y obtienes:

 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

(lo siento, no puedo alinear ese bit).

Creo que si tiene una herramienta de informes que puede hacer tabulaciones cruzadas, esto sería mucho más fácil de hacer allí.