Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Porównanie cen produktów w sql

Myślę, że tego właśnie szukasz.

SQLFiddle

To trochę brzydkie, ale oto mały podział.

Ten blok pozwala uzyskać dynamiczną listę swoich wartości. (Nie pamiętam, komu to ukradłem, ale to jest niesamowite. Bez tego oś obrotu nie jest lepsza niż podejście do tego z wielkim gigantycznym przypadkiem).

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

Twoja zmienna @cols wygląda tak:

[Amazon],[eBay],[Sears]

Następnie musisz zbudować ciąg całego zapytania:

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
'

Tabela pochodna piv1 pobiera wartości przestawne. Sprytnie nazwana tabela pochodna tt daje ci sprzedawcę, który ma minimalną sprzedaż na każdy dzień. (Mówiłem ci, że to trochę brzydkie.)

I na koniec uruchamiasz zapytanie:

execute(@query)

I otrzymujesz:

 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

(przepraszam, nie mogę ustawić tego bitu).

Myślę, że jeśli masz narzędzie do raportowania, które może wykonywać tabele krzyżowe, byłoby to o wiele łatwiejsze do zrobienia.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Podziel partycję na dwie w SQL Server (T-SQL)

  2. SQL Server 2008 Pusty ciąg a spacja

  3. SQL - bezpiecznie prześlij BIGINT do INT

  4. serwer sql przekonwertować datetime na inną strefę czasową?

  5. Jak usunąć rozszerzone znaki ASCII z ciągu w T-SQL?