SQL выводит неизвестное количество значений строк в виде столбцов - PullRequest
0 голосов
/ 13 февраля 2019

Я загружаю опрос в базу данных SQL Server (2016), и, к сожалению, единственный способ получить данные - через JSON.Я думаю, что у меня пердит мозг, так как я не могу понять, что я считаю простым.У меня есть таблица с несколькими атрибутами / идентификаторами, а последние 2 поля - это вопрос и ответ на опрос, как показано ниже.С помощью SQL, как я могу сделать следующее?

-------------------------------
| Id | Question  | Answer     |
-------------------------------
| 1  | Q1        | A1         |
| 2  | Q2        | A2         |
| 3  | Q3        | A3         |
-------------------------------

Мне нужно получить его в следующем формате.В основном, превращая вопросы в столбцы.Это возможно?На что стоит обратить внимание, количество строк неизвестно, поэтому может быть около 50 вопросов опроса или около того.Это переменная.

-------------------------------
ID | Q1  | Q2 | Q3  |
-------------------------------
 1 | A1  | A2 | A3  |

Спасибо,

1 Ответ

0 голосов
/ 13 февраля 2019

Вы можете использовать динамический Sql для поворота с неизвестными именами столбцов.

пример:

-- Test table
CREATE TABLE YourTable
(
    ID int primary key identity(1,1),
    OtherId int not null,
    Question varchar(30) not null,
    Answer varchar(30) not null
);

-- Sample Data
insert into YourTable (OtherId, Question, Answer) values
 (1, 'Q1', 'A1'), (1, 'Q2', 'A2'), (1, 'Q3', 'A3'), 
 (2, 'Q1', 'A4'), (2, 'Q2', 'A5'), (2, 'Q3', 'A6');

Запрос

DECLARE @Cols  AS NVARCHAR(MAX);
DECLARE @DynSql AS NVARCHAR(MAX);

SELECT @Cols = CONCAT(@Cols + ', ', QUOTENAME(Question))
FROM YourTable
GROUP BY Question
ORDER BY Question;

SET @DynSql = N'SELECT * 
FROM  
(
    SELECT OtherId, Question, Answer
    FROM YourTable
) src
PIVOT 
(
    MAX(Answer) 
    FOR Question IN (' + @Cols + N')
) pvt
ORDER BY OtherId';

-- SELECT @DynSql AS DynSql;
EXECUTE sp_executesql @DynSql;

Результат:

OtherId Q1  Q2  Q3
1       A1  A2  A3
2       A4  A5  A6
...