sql >> Databáze >  >> RDS >> Sqlserver

Porovnání cen produktů v sql

Myslím, že to je to, co hledáte.

SQLFiddle

Je to trochu ošklivé, ale tady je malý rozpis.

Tento blok vám umožňuje získat dynamický seznam vašich hodnot. (Nepamatuji si, komu jsem to ukradl, ale je to úžasné. Bez toho není pivot opravdu o nic lepší než přístup k velkému obrovskému případu.)

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

Vaše proměnná @cols vypadá takto:

[Amazon],[eBay],[Sears]

Poté musíte vytvořit řetězec celého dotazu:

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
'

Odvozená tabulka piv1 vám poskytne pivotované hodnoty. Chytře pojmenovaná odvozená tabulka tt vám dá prodejce, který má minimální tržby za každý den. (Říkal vám, že je to trochu ošklivé.)

A nakonec spustíte dotaz:

execute(@query)

A dostanete:

 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

(omlouvám se, tento bit nelze seřadit).

Domnívám se, že pokud máte nástroj pro vytváření přehledů, který umí provádět křížové tabulky, bylo by to mnohem jednodušší.



  1. Proč MySQL vrací stejné výsledky při použití RAND() v příkazu SELECT?

  2. Jak získat pozici shody regulárních výrazů v řetězci v PostgreSQL?

  3. MySQL:Převést relativní počet sekund na datum a čas?

  4. MySQL vložit tam, kde neexistuje / pokud ne existuje