2
create table Products
    (
      id int,
      ProductName varchar(200),
      ProductCategory varchar(200),
      ProductImage varchar(200),
      ProductUri varchar(200),
    )

Insert into Products values(135, 'Product X', 'Digital Camera', Null, Null)
Insert into Products values(136, 'Product Y', 'Mobile', Null, Null)

create table Product_Price
    (
      id int,
      ProductId int,
      dt date,
      SellerName varchar(20),
      Available varchar(20),
      Offer varchar(20),      
      Price money,
      Shipping money
    )

insert into Product_Price values (1, 135,'2012-01-16','Sears','In Stock','30% discount',32.00,2.00)
insert into Product_Price values (2, 135,'2012-01-16','Amazon','In Stock',Null,30.00,NULL)
insert into Product_Price values (3, 135,'2012-01-16','eBay','Just 2 Left',Null,28.00,1.00)

insert into Product_Price values (4, 136,'2012-01-16','Sears','In Stock','30% discount',30.00,6.00)
insert into Product_Price values (5, 136,'2012-01-16','Amazon','In Stock',Null,28.00,4.00)
insert into Product_Price values (6, 136,'2012-01-16','eBay','Out Of stock',Null,Null,Null)

そして、私はこのような結果が欲しい:

   ID ProductName ProductCategory ProductImage ProductUri SearsTotal Price(Price+Shipping) SearsAvailablity SearsOffer #Competitors DifferencePercentage(Sears & other) AmazonTotal Price(Price+Shipping) AmazonAvailablity AmazonOffer eBayTotal Price(Price+Shipping) eBayAvailablity eBayOffer
135 商品 X デジタル カメラ NULL NULL 34 在庫あり 30% 割引 2 15.25423729 30 在庫あり NULL 29 残り 2 個 NULL
136 製品 Y モバイル NULL NULL 36 在庫あり 25% 割引 1 12.5 32 在庫あり NULL NULL 在庫なし NULL

ステップ 1 はこちら: SQL での製品価格の比較 私のテストはこちら: http://sqlfiddle.com/#!3/ec1e7/6

4

2 に答える 2

0

まあ、これは「可能」ですが、かなりおかしくなっています。家でこれを試さないでください!この種のことを行うには、ある種のレポートツールが本当に必要です。

SQLフィドル

他の投稿で使用したロジックに基づいて構築すると、もう 1 つの変数が必要になります。ピボットされた各列の最大値を選択する文字列を作成します。それでは、次から始めます。

DECLARE @cols AS VARCHAR(MAX)
DECLARE @cols2 AS VARCHAR(MAX)
DECLARE @query AS NVARCHAR(MAX)
DECLARE @COL_ALIASES AS VARCHAR(MAX)


Select @COL_ALIASES = ISNULL(@COL_ALIASES + ', ', '') +
            'Max(' + QUOTENAME(SellerName + '_TOTAL') + ') As ' + QUOTENAME(SellerName + '_TOTAL') + ', ' +
            'Max(' + QUOTENAME(SellerName + '_AVAILABLE') + ') As ' + QUOTENAME(SellerName + '_AVAILABLE')

            from #Product_Price




select @cols = STUFF((SELECT distinct ',' +
                        QUOTENAME(SellerName + '_TOTAL')
                      FROM #Product_Price
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '')

select @cols2 = STUFF((SELECT distinct ',' +
                        QUOTENAME(SellerName + '_AVAILABLE')
                      FROM #Product_Price
                      FOR XML PATH(''), TYPE
                     ).value('.', 'NVARCHAR(MAX)') 
                        , 1, 1, '')

次に、すべての楽しいものからクエリ文字列を組み立てます。

select @query =
' select p.id ,
p.productname,' + + @COL_ALIASES + CHAR(10) +

' from Products p
inner join (
select
productId,
' + @cols + ',' + @cols2 + '
from
(
select
p1.id as ProductID,
p2.sellername + ''' + '_TOTAL' + ''' As TotalSeller,
p2.sellername + ''' + '_AVAILABLE' + ''' as AvailableSeller,
p2.price,
p2.available

from
products p1
inner join product_price p2
on p1.id = p2.productid ) t1
PIVOT (max(price)  for TotalSeller in (' + @cols + ')) t
PIVOT (max(available) for AvailableSeller in (' + @cols2 + ') ) u )
 pvt
ON p.id = pvt.productid
GROUP BY p.id,
p.productname
 '

最後に、実行します。

Exec sp_executesql @Query

追加のピボットを追加するには、このロジックを拡張し続けるだけです。これがクレイジーになっていると私が言った理由がわかります。挑戦を楽しんだという理由だけでこれを行いましたが、実際にこれを使用しようとすることはお勧めしません. 他の投稿で人々が指摘しているように、SQL インジェクションにさらされる可能性があり、維持するのは困難です。今から 6 か月後にこれを見た場合、このクエリで一体何が起こっていたのか、おそらくわからないでしょう。

于 2013-11-12T18:29:06.830 に答える