2016-08-18 10 views
0

上:SQL Serverの:ピボットを使用した動的SQL私は、このSQL Serverのクエリを持っている最大数に基づい

SELECT [VendorID], [QuotedAmount] 
FROM [tbl_Vendor_Quotation] 
WHERE [ProductID] = 1 
ORDER BY vendorID 

このクエリは、このようなデータを返します。

VendorID  QuotedAmount 
------------------------- 
    1   1000000 
    1    900000 
    1    750000 
    1    720000 
    1    650000 
    2   1250000 
    2   1200000 
    3   1500000 
    4   1000000 
    4    970000 
    4    950000 
    5   1450000 
    6   1450000 
    8   1200000 

私はこのようにし旋回するようにしたいですそれはR0、R1、以下の表のとおり

VendorId  R0  R1  R2  R3  R4 
---------------------------------------------------------- 
    1   1000000 900000 750000 720000 650000 
    2   1250000 1200000 
    3   1500000 
    4   1000000 970000 950000 
    5   1450000 
    6   1450000 
    8   1200000 

を考え出すだろうという方法--- Rnが最大回を表示しますQuotedAmountを繰り返します。この場合、ベンダーID 1と同じR0、R1〜R4(5回)が5回繰り返される最大時間です。

私はそれを作るために多くの例に従ったが、成功しなかった。私を助けてください。あなたはrow_numberウィンドウ関数で最初にそれらをランク付けする必要があり

答えて

1

動的SQL +ピボット:

DECLARE @cols nvarchar(max), 
     @sql nvarchar(max) 

SELECT @cols = (
    SELECT DISTINCT ',[R'+ CAST(ROW_NUMBER() OVER (PARTITION BY VendorID ORDER BY (SELECT NULL)) - 1 as nvarchar(10)) +']' 
    FROM tbl_Vendor_Quotation 
    FOR XML PATH('') 
    ) 

SELECT @sql = N' 
SELECT * 
FROM (
    SELECT VendorID, 
      QuotedAmount, 
      ''R''+ CAST(ROW_NUMBER() OVER (PARTITION BY VendorID ORDER BY (SELECT NULL)) - 1 as nvarchar(10)) as Cols 
    FROM tbl_Vendor_Quotation 
    WHERE [ProductID] = 1 
    ) as p 
PIVOT (
    MAX(QuotedAmount) FOR Cols IN ('+STUFF(@cols,1,1,'')+') 
) as pvt' 

EXEC sp_executesql @sql 

出力:

VendorID R0  R1  R2  R3  R4 
1   1000000 900000 750000 720000 650000 
2   1250000 1200000 NULL NULL NULL 
3   1500000 NULL NULL NULL NULL 
4   1000000 970000 950000 NULL NULL 
5   1450000 NULL NULL NULL NULL 
6   1450000 NULL NULL NULL NULL 
8   1200000 NULL NULL NULL NULL 

Rn数はで動的に成長しますベンダーの行番号が増える場合

+0

これは完璧なO/Pを提供しますが、ヌル値を持つ2つの余分な列を持ちます。 –

+0

'QuotedAmount'に' NULL'sを持つベンダーがいるのでしょうか?これを確認してください。 – gofr1

1

select VendorId, [1] as R0,[2] as R1,[3] as R2,[4] as R3,[5] as R4 
    from (
     select VendorId, QuotedAmount, 
       ROW_NUMBER() over (partition By VendorId order by QuotedAmount desc) as rn 
     from tbl_Vendor_Quotation 
     WHERE [ProductID] = 1) t1 
    PIVOT 
    (
    max(QuotedAmount) 
    for rn in ([1],[2],[3],[4],[5])) As PivotTable 
+0

それはうまくいきます。しかし、1をもう一度繰り返すとどうなりますか? R5は自動的に来ますか? –

+0

@SabyasachiMishraいいえ、それは動的ではありません。あなたは "最大時間は5回繰り返した"と言った。 – vercelli

+1

@SabyasachiMishra動的ピボットをお探しの場合は、これを試してみてください:http://stackoverflow.com/questions/10404348/sql-server-dynamic-pivot-query(私が使用したランク付け) – vercelli

1

ありがとうございます@vercelli

私はあなたの助けを借りて私の答えを得ました。

Declare @ProdID int 
set @ProdID=1 
DECLARE @columnName VARCHAR(1000) 
DECLARE @columnVal VARCHAR(1000) 
DECLARE @Query VARCHAR(1000) 

--Create dynamic column name 
SELECT @columnName =COALESCE(@columnName + ', ','')+'['+cast(rn as varchar(10))+'] AS [R'+cast(rn as varchar(10))+']', 
    @columnVal =COALESCE(@columnVal + ',','')+'['+cast(rn as varchar(10))+']' FROM   
(select distinct 
       ROW_NUMBER() over (partition By VendorId order by QuotedAmount desc) as rn 
     from tbl_Vendor_Quotation where [ProductRequestID][email protected] ) a 

    print @columnName print @columnVal 

    set @Query='select VendorId,'[email protected]+' 
    from (
     select VendorId, QuotedAmount, 
       ROW_NUMBER() over (partition By VendorId order by QuotedAmount desc) as rn 
     from tbl_Vendor_Quotation where [ProductRequestID]='+cast(@ProdID as varchar(10))+') t1 
    PIVOT 
    (
    max(QuotedAmount) 
    for rn in ('[email protected]+')) As PivotTable' 
    exec (@Query) 
関連する問題