2016-08-18 20 views
0

我有這樣的SQL Server查詢上:SQL服務器:動態SQL與樞軸最大計數的基礎

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 

我要轉動這個這樣的一種方式,它會拿出按如下表

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 

R0,R1 --- Rn中顯示的最大倍VendorIDQuotedAmount重複。在這種情況下,作爲VendorID1的R0,R1 --- R4(5次)是重複5次的最大時間。

我遵循了很多例子,但沒有取得成功。請幫幫我。

回答

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'?請檢查這個。 – gofr1

1

你必須用row_number窗口功能首先對他們進行排名:

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 @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)