1

以下のクエリのようなテーブルがあり、このテーブルに毎日異なる販売者名で製品価格を追加します。

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 シアーズ[マイサイト] Amazon Ebay 最低価格
2012 年 1 月 16 日 AA 32 40 27 イーベイ
2012 年 1 月 17 日 紀元前 33.2 30 51.4 アマゾン
2012 年 1 月 18 日 DE 7.5 11.1 9.4 シアーズ
4

3 に答える 3

3

これがあなたが探しているものだと思います。

SQLフィドル

ややこしいですが、ここで少し内訳を示します。

このブロックを使用すると、値の動的リストを取得できます。(誰からこれを盗んだのか思い出せませんが、素晴らしいです。これがなければ、ピボットは、これに対する巨大なケース ステートメント アプローチよりも優れているとは言えません。)

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

(申し訳ありませんが、そのビットを並べることはできません)。

クロス集計を実行できるレポート ツールがあれば、非常に簡単に実行できると思います。

于 2013-11-07T17:32:01.037 に答える
0

これは、おそらく PIVOT でうまく機能するものです。Microsoft のドキュメントは、実際には PIVOT と UNPIVOT でかなり役に立ちます。

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

基本的に、SellerName の場合は列を選択し、それをピボットして、列自体の要素が新しい結果の列になるようにすることができます。新しい「Ebay」、「Amazon」などの列に入る値は、選択した集計になります。この場合、価格の 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 列を含めます。

于 2013-11-07T16:44:21.420 に答える