2016-11-30 5 views
2

Я пытаюсь сделать стержень в SQL Server, в котором мне нужно откинуть следующую таблицу:SQL Pivot после Креста Применить

key  value 
column1 billy 
column2 [email protected] 
column5 NULL 
column6 false 
column9 true 

Я хочу значения в столбце «ключ», чтобы быть заголовки столбцов. Другая проблема заключается в том, что я использую CROSS APPLY для создания этой таблицы из другой таблицы. Я начинаю с:

select * from jtable cross apply openjson(json) 

, что приводит к приведенному выше формату таблицы.

Если я не использую крест применить, я получаю таблицу, которая выглядит следующим образом:

ID json 
1 "column1":billy, "column2":[email protected] 
2 "column1":steve, "column2":[email protected] 

Так что я пытаюсь закончить с таблицей, которая выглядит так:

column1 column2   column3 
billy  [email protected] false 
steve  [email protected]  false 

ответ

1

Что-то вроде этого:

SELECT * 
FROM 
(
    select ROW_NUMBER() OVER (ORDER BY(SELECT 1)) AS ID 
      ,* 
    from jtable 
    cross apply openjson(json) 
) DS 
PIVOT 
(
    MAX([value]) FOR [key] IN ([column1], [column2], [column3], ... , [columnN]) 
) PVT 

Если вы не знаете, количество столбцов, поиск dynamic PIVOT. Если вам нужно отсортировать по другим критериям (сгенерируйте ID другим способом) - вы можете изменить функцию ROW_NUMBER.