2015-01-28 4 views
1

У меня есть эта таблица:Как преобразовать строки в столбцы с помощью PIVOT в SqlServer

Dimension Meaning 
--------- ------- 
Browser  IE9 
Browser  IE10 
Module  Ticket 
Module  Board 
OS   Windows 
OS   Ios 
OS   Linux 

И я хочу что-то вроде всех возможных комбинаций:

Browser  Module  OS 
-------  ------  ------ 
IE9   Ticket  Windows 
IE9   Ticket  Ios 
IE9   Ticket  Linux 
IE10  Board  Windows 
IE10  Board  Ios 
IE10  Board  Linux 

и так далее ... В исходной таблице не так много, поэтому никакой фантазии производительности не требуется, и я не против жесткого кода столбцов

Я в настоящее время использую этот запрос, но я получаю только одну строку:

SELECT [Browser],[Module],[Os] FROM 
     (
      SELECT Meaning, Dimension 
      FROM [Mits].[dbo].[ToolHintValues] 
     ) x 
     pivot 
     (
      MAX(Meaning) 
      FOR Dimension IN ([Browser],[Module],[Os]) 
     ) p 

Любая помощь в том, как я могу получить все комбинации? Заранее спасибо

Update: Это динамическая версия SQL еще возвращая одну строку:

DECLARE @cols AS NVARCHAR(MAX) 
DECLARE @query AS NVARCHAR(MAX) 
select @cols = STUFF((SELECT ',' + QUOTENAME(Dimension) 
       from [dbo].[ToolHintValues] 
       group by Dimension 
       order by Dimension 
     FOR XML PATH(''), TYPE 
     ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'') 
set @query = N'SELECT ' + @cols + N' FROM 
     (
      SELECT Meaning, Dimension 
      FROM [dbo].[ToolHintValues] 
     ) x 
     pivot 
     (
      MAX(Meaning) 
      FOR Dimension IN (' + @cols + N') 
     ) p ' 
SELECT @query 
exec sp_executesql @query; 
+0

Если я правильно понимаю, есть 12 комбинаций. Почему вы только перечислили шесть? –

+0

Да, 12 комбинаций, я просто не хотел писать их все, поэтому я написал «все возможные комбинации» – Metalex

ответ

0

Если вы знаете, что размеры, вы можете использовать cross join:

select b.meaning as browser, m.meaning as module, o.meaning as os 
from (select distinct meaning from thistable where dimension = 'browser' 
    ) b cross join 
    (select distinct meaning from thistable where dimension = 'module' 
    ) m cross join 
    (select distinct meaning from thistable where dimension = 'os' 
    ) o; 

Если вы не знаете всех измерений, тогда вам придется сделать что-то более сложное с динамическим SQL. SQL-запрос возвращает фиксированный набор столбцов; чтобы иметь переменное число, вам нужен динамический SQL.

+0

# Mr.Linoff, пожалуйста, объясните, как использовать динамические запросы –

+0

Просто добавил динамический SQL, но все же получая только одну строку. – Metalex

+0

@AlexMetalex. , , Вы говорите, что указанный выше запрос возвращает только одну строку? Pivot - неправильный подход для получения всех комбинаций. 'cross join' есть. –

Смежные вопросы