Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Produktpreisvergleich in sql

Ich denke, das ist es, wonach Sie suchen.

SQLFiddle

Es ist irgendwie hässlich, aber hier ist eine kleine Aufschlüsselung.

Dieser Block ermöglicht es Ihnen, eine dynamische Liste Ihrer Werte zu erhalten. (Kann mich nicht erinnern, von wem ich das gestohlen habe, aber es ist großartig. Ohne das ist Pivot wirklich nicht besser als ein Ansatz mit großen Fallbeispielen.)

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

Ihre @cols-Variable sieht folgendermaßen aus:

[Amazon],[eBay],[Sears]

Dann müssen Sie eine Zeichenfolge Ihrer gesamten Abfrage erstellen:

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
'

Die abgeleitete Tabelle piv1 liefert Ihnen die Pivot-Werte. Die clever benannte abgeleitete Tabelle tt gibt Ihnen den Verkäufer mit den Mindestumsätzen für jeden Tag. (Ich sagte Ihnen, es sei ziemlich hässlich.)

Und schließlich führen Sie Ihre Abfrage aus:

execute(@query)

Und Sie erhalten:

 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

(Entschuldigung, kann diese Bitzeile nicht erstellen).

Ich denke, wenn Sie ein Reporting-Tool haben, das Kreuztabellen erstellen kann, wäre dies dort viel einfacher.