sql >> Database >  >> RDS >> Sqlserver

Productprijsvergelijking in sql

Ik denk dat dit is wat je zoekt.

SQLFiddle

Het is een beetje lelijk, maar hier is een kleine uitsplitsing.

Met dit blok kunt u een dynamische lijst van uw waarden krijgen. (Ik kan me niet herinneren van wie ik dit heb gestolen, maar het is geweldig. Zonder dit is pivot echt niet beter dan een grote gigantische case-statementbenadering hiervoor.)

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

Je @cols-variabele komt er als volgt uit:

[Amazon],[eBay],[Sears]

Dan moet je een string van je hele zoekopdracht maken:

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
'

De van piv1 afgeleide tabel geeft u de gedraaide waarden. De slim genoemde tt-afgeleide tabel geeft je de verkoper die de minimale verkoop voor elke dag heeft. (Ik zei toch dat het een beetje lelijk was.)

En tot slot voert u uw zoekopdracht uit:

execute(@query)

En je krijgt:

 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

(sorry, ik kan dat stukje niet op een rij zetten).

Ik zou denken dat als je een rapportagetool hebt die kruistabellen kan maken, dit een stuk eenvoudiger zou zijn om daar te doen.



  1. Docker Compose mysql import .sql

  2. Query twee db met behulp van group by en detailinformatie weergeven

  3. Update alleen datum op datetime-veld op Pl/SQL

  4. SqlCommand maximale parameters uitzondering bij 2099 parameters