Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comparaison des prix des produits en sql

Je pense que c'est ce que vous cherchez.

SQLFiddle

C'est un peu moche, mais voici une petite ventilation.

Ce bloc vous permet d'obtenir une liste dynamique de vos valeurs. (Je ne me souviens plus à qui j'ai volé ça, mais c'est génial. Sans cela, pivot n'est vraiment pas mieux qu'une approche de déclaration de cas géante pour cela.)

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

Votre variable @cols se présente ainsi :

[Amazon],[eBay],[Sears]

Ensuite, vous devez créer une chaîne de votre requête entière :

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 table dérivée piv1 vous donne les valeurs pivotées. La table dérivée tt intelligemment nommée vous donne le vendeur qui a les ventes minimales pour chaque jour. (Je vous avais dit que c'était plutôt moche.)

Et enfin, vous lancez votre requête :

execute(@query)

Et vous obtenez :

 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

(désolé, je ne peux pas aligner ce bit).

Je pense que si vous avez un outil de création de rapports capable de faire des tableaux croisés, ce serait beaucoup plus facile à faire là-bas.