2015-02-20 5 views
0

У меня есть таблица с тремя столбцами.Таблица SQL Server 2008 R2 Pivot

Столбец color может быть динамическим, теперь у меня есть 4 элемента, после того как я получу 6 элементов или больше.

enter image description here

Как написать запрос, чтобы сделать это?

Спасибо

+0

Если возможно, ручка 'Pivot' в языке программирования. –

+0

Почему FFF равно 2? Какую агрегированную функцию вы хотите применить к столбцу Value? –

+0

Что вы делали до сих пор? –

ответ

1

Вы можете использовать динамический SQL, как:

CREATE TABLE #t 
    (
     Company CHAR(3) , 
     Value INT , 
     color NVARCHAR(10) 
    ) 
GO 

DECLARE @c NVARCHAR(MAX) = '[' 
DECLARE @s NVARCHAR(MAX) = '' 

INSERT INTO #t 
VALUES ('AAA', 2, 'red'), 
     ('AAA', 2, 'white'), 
     ('BBB', 2, 'white'), 
     ('BBB', 3, 'blue'), 
     ('CCC', 3, 'pink'), 
     ('FFF', 4, 'blue') 


SELECT @c = @c + color + '],[' 
FROM (SELECT DISTINCT 
        color 
      FROM  #t 
     ) AS t 
SELECT @c = SUBSTRING(@c, 1, LEN(@c) - 2) 


SET @s = ';WITH cte AS 
(
    SELECT Company, Value, color FROM #t 
) 
SELECT Company, ' + @c + ' FROM cte 
PIVOT(MAX(Value) FOR color IN(' + @c + ')) AS p' 

EXEC(@s) 

Выход:

Company blue pink red white 
AAA  NULL NULL 2  2 
BBB  3  NULL NULL 2 
CCC  NULL 3  NULL NULL 
FFF  4  NULL NULL NULL 

Примените соответствующую агрегацию в сводной оговорке.

+0

Отлично !!! Большое спасибо за Вашу помощь !!! – Alan392

1

Использование PIVOT. Подробнее SQL SERVER – PIVOT and UNPIVOT Table Examples

SELECT Company, red, white, blu, pink 
FROM TableName 
PIVOT(MAX(Value) FOR Color IN(ed, white, blu, pink))AS Piv 

Dynamic Pivot:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX); 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.Color) 
      FROM TableName c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT Company, ' + @cols + ' from 
      (
       select Company 
        , value 
        , color 
       from TableName 
      ) x 
      pivot 
      (
       max(value) 
       for color in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

Но колонка «цвета» динамична, теперь красная, игла и т. Д. После blu, черный – Alan392

+0

@ Alan392: Проверьте обновленный результат. –