2016-08-18 2 views
0

у меня есть этот запрос SQL Server:SQL Server: Dynamic SQL с Pivot на основе максимального кол

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 Показывает Максимальное время VendorID Повторяется с QuotedAmount. В этом случае R0, R1 --- R4 (5 раз) в качестве VendorID 1 - максимальное время, повторяемое 5 раз.

Я следовал примеру, чтобы сделать это, но не получил успехов. Пожалуйста, помогите мне.

ответ

1

Dynamic 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

Возможно, есть некоторые поставщики с 'NULL' в 'QuotedAmount'? Пожалуйста, проверьте это. – 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, если вы ищете динамический стержень, попробуйте это: 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)