Преобразование данных для данных опроса - SQL Server - PullRequest
0 голосов
/ 15 ноября 2018

Я здесь новичок и все еще учусь, поэтому, пожалуйста, дайте мне благодать, когда я пытаюсь объяснить, что я пытаюсь сделать.

У меня есть данные, которые выглядят так

what I currently have

НО, я хочу, чтобы это выглядело так

What I want

У меня есть данные, загруженные на наш SQL Server, и мне нужно знать, как преобразовать их с помощью кода SQL.

Может кто-нибудь мне помочь?

Ответы [ 3 ]

0 голосов
/ 15 ноября 2018

Вам необходимо использовать ключевое слово "unpivot", например:

select u.SrNo, u.question, u.Answer
from yourtable
unpivot
(
  Answer
  for question in ([I like to go to school], [Learning is fun])
) u;
0 голосов
/ 16 ноября 2018

Вот динамическая версия того, что Гордон предложил выше ...

IF OBJECT_ID('CodeTest.dbo.TestData', 'U') IS NOT NULL 
BEGIN DROP TABLE dbo.TestData; END;

CREATE TABLE dbo.TestData (
    SrNum INT NOT NULL,
    [I like to go to school] CHAR(3) NOT NULL,
    [Learning is fun] CHAR(3) NOT NULL 
    );
INSERT dbo.TestData (SrNum, [I like to go to school], [Learning is fun]) VALUES
    (1, 'Yes', 'Yes'), (2, 'Yes', 'Yes');


--=================================================

DECLARE @sql NVARCHAR(MAX) = N'';

SELECT 
    @sql = CONCAT(@sql, N',
        (', c.column_id, N', ''', c.name, N''', td.[', c.name, N'])')
FROM
    sys.columns c
WHERE 
    c.object_id = OBJECT_ID('CodeTest.dbo.TestData', 'U')
    AND c.column_id > 1

SET @sql = CONCAT(N'
SELECT 
    td.SrNum,
    qa.Question,
    qa.Answer
FROM 
    dbo.TestData td
    CROSS APPLY ( VALUES', 
    STUFF(@sql, 1, 1, N''), N'
        ) qa (Qnum, Question, Answer)
ORDER BY 
    td.SrNum,
    qa.Qnum;');

EXEC sys.sp_executesql @sql;

Результаты:

SrNum       Question               Answer
----------- ---------------------- ------
1           I like to go to school Yes
1           Learning is fun        Yes
2           I like to go to school Yes
2           Learning is fun        Yes
0 голосов
/ 15 ноября 2018

Я бы использовал cross apply:

select t.sr_no, v.*
from t cross apply
     (values ('I like to go to school', [I like to go to school]),
             ('Learning is fun', [Learning is fun])
     ) v(question, answer);
...