2013-12-19 5 views
2

Проведено некоторое исследование этого, но havent удалось найти пример, который работает на меня.sql create pivot chart + rows to colums

У меня есть таблица, изображение, показанное ниже, скрипку here

enter image description here

, что я хочу сделать, это преобразовать строки в colums. Я читаю un on pivots, но немного потерял.

Я хочу, чтобы мой выход будет:

enter image description here

с помощью SQL, как я могу добиться этого.

Должно ли это быть достигнуто с переменными?

благодаря как всегда,

ответ

2

Вы можете использовать функцию PIVOT, чтобы получить результат. Если у вас есть известное число значений, то вы можете жестко закодировать запрос похож на следующее:

select type, color, 
    [1], [1.5], [2], [3], [4] 
from 
(
    select type, color, length, price 
    from items 
) d 
pivot 
(
    max(price) 
    for length in ([1], [1.5], [2], [3], [4]) 
) piv 
order by type; 

См SQL Fiddle with Demo. Но если вы собираетесь иметь неизвестное количество length значений, то вам необходимо будет использовать динамический SQL:

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

select @cols = STUFF((SELECT ',' + QUOTENAME(length) 
        from items 
        group by length 
        order by length 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT type, color, ' + @cols + ' 
      from 
      (
       select type, color, length, price 
       from items 
      ) x 
      pivot 
      (
       max(price) 
       for length in (' + @cols + ') 
      ) p 
      order by type' 

execute sp_executesql @query; 

См SQL Fiddle with Demo

1

Вот запрос сводного этой таблицы. Но вы должны знать значения Length для определения строк, если вы их не знаете, а затем вы need to use dynamic query.

SELECT Type,Color, 
     MAX(CASE WHEN Length=1 THEN price END) as [1], 
     MAX(CASE WHEN Length=1.5 THEN price END) as [1.5], 
     MAX(CASE WHEN Length=2 THEN price END) as [2], 
     MAX(CASE WHEN Length=3 THEN price END) as [3], 
     MAX(CASE WHEN Length=4 THEN price END) as [4] 

FROM items 
GROUP BY Type,Color 

SQLFiddle demo