在SQL产品的价格比较(Product price comparison in sql)

2019-10-18 22:32发布

我有一个表看起来像下面的查询给出的,我想补充的产品价格在该表中,每天,不同卖家的名字:

create table Product_Price
    (
      id int,
      dt date,
      SellerName varchar(20),
      Product varchar(10),
      Price money
    )

    insert into Product_Price values (1, '2012-01-16','Sears','AA', 32)
    insert into Product_Price values (2, '2012-01-16','Amazon', 'AA', 40)
    insert into Product_Price values (3, '2012-01-16','eBay','AA', 27)

    insert into Product_Price values (4, '2012-01-17','Sears','BC', 33.2)
    insert into Product_Price values (5, '2012-01-17','Amazon', 'BC',30)
    insert into Product_Price values (6, '2012-01-17','eBay', 'BC',51.4)

    insert into Product_Price values (7, '2012-01-18','Sears','DE', 13.5)
    insert into Product_Price values (8, '2012-01-18','Amazon','DE', 11.1)
    insert into Product_Price values (9, '2012-01-18', 'eBay','DE', 9.4)

我想造成这样的卖家数为n(如更多的卖家表加)

DT           PRODUCT   Sears[My Site]   Amazon   Ebay   Lowest Price
1/16/2012    AA        32               40       27     Ebay
1/17/2012    BC        33.2             30       51.4   Amazon
1/18/2012    DE        7.5              11.1     9.4    Sears

Answer 1:

我认为这是你在找什么。

SQLFiddle

这是一种丑陋,但这里有一个小故障。

此块可以让你得到你的价值观的动态列表。 (不记得我偷了这个谁从,但它的真棒。如果没有这个,真的支点并不比一个大巨头case语句的方法来这个更好。)

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

你@cols可变出来,像这样:

[Amazon],[eBay],[Sears]

然后,你需要构建一个完整的查询字符串:

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
'

该PIV1派生表让你的摆动值。 在巧妙地命名为TT派生表让你谁拥有每一天的最低销售卖家。 (告诉你这是一种丑陋的。)

最后,在运行查询:

execute(@query)

你会得到:

 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

(抱歉,不能使该位线了)。

我认为,如果你有一个报告工具,可以做交叉表,这将是一个更容易赫克在那里做。



Answer 2:

问题是这样的要求:

我想造成这样的卖家的n个

如果你有你的结果的固定的,已知的列数,有几种技术支点数据。 但是,如果不知道的列数,你就麻烦了。 SQL语言真的希望你能够描述在数量方面和类型的前面列的选择列表中的结果集的确切性质。

这听起来像你不能这样做。 这使你有两个选择:

  1. 查询到的数据就知道你有多少店有他们的名字,然后使用该信息来建立一个动态的SQL语句。
  2. (优选的选项)执行在客户端代码的枢轴。


Answer 3:

这是什么,可能会与PIVOT很好地工作。 微软的文档实际上是在PIVOT和UNPIVOT非常有用的。

http://technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx

基本上,它可以让你选择一栏,你的情况SELLERNAME,并转动了这一点,这样的列元素本身成为新的结果列。 是走在新的“易趣”,“亚马逊”的价值观等栏目将是您选择的集合 - 在这种情况下,MAX或MIN或价格AVG。

对于最后的“最低价格”一栏你很可能是最好做在你的主查询子查询发现其中每个产品/日的最低值,然后在加入该回得到SELLERNAME服务。 就像是:

SELECT 
    Product_Price.Date
    ,Product_Price.Product
    ,Product_Price.MinimumSellerName
FROM
(SELECT 
MIN(Price) AS min_price
,Product
,Date
FROM Product_Price
GROUP BY
Product
,Date) min_price
INNER JOIN Product_Price
ON min_price.Product = Product_Price.Product
    AND min_price.Date = Product_Price.Date

然后,只是把周围的支点和包括MinimumSellerName columnm,就像你有日期和产品。



文章来源: Product price comparison in sql