2013-04-15 2 views
0

Моя ситуация такова:SQL Server Транспонирование (возможно поворот?) Несколько строк в одну колонку

У меня есть опрос на 400 пользователей (строк), отвечающих на 76 вопросов (столбцы). У этих пользователей уже есть ID в базе данных. Я создал таблицу, содержащую вопросы для каждой компании, и каждый вопрос имеет свой собственный идентификатор. Поэтому теперь мне нужно выйти замуж за идентификатор вопроса в ответ на ID пользователя.

Когда я импортировать заголовки столбцов должны быть:

User ID | Question ID | Answer 
xxxxxxx | xxxxxxxxxxxxx | xxxxxxxxxx 

Вместо:

User ID | Question ID 1 | Question ID 2 | Question ID 3 | etc... 
xxxxxx | xxxxx   | xxxxx   | xxxxx   | ... 

Любые и вся помощь оценили, спасибо.

+0

вы пробовали писать его в качестве шарнирного запроса еще? – Limey

+0

Вы упомянули об импорте ответов; вы уже это сделали? Если нет, почему бы не перенести данные перед загрузкой в ​​базу данных. Это легко сделать с чем-то вроде Excel. – BellevueBob

+0

Вплоть до этого момента, это то, что я делал, но есть так много пользователей, что потребовалось бы навсегда, чтобы назначить идентификатор пользователя обратно на ответы. Я искал способ сделать это с помощью сводных таблиц, но пока не могу обойти структуру иерархии. – user2187945

ответ

1

Похоже, что вы хотите UNPIVOT данных. Существует несколько способов сделать это в зависимости от вашей версии SQL Server.

Если вы используете SQL Server 2005+, вы можете использовать функцию UNPIVOT, преобразующий столбцы в строки:

select userid, questionid, answer 
from yourtable 
unpivot 
(
    answer 
    for questionId in (QuestionId1, QuestionId2) 
) unpiv; 

Если вы используете SQL Server 2008+, то вы можете использовать функцию UNPIVOT но вы можете также использовать CROSS APPLY и ЦЕННОСТИ, чтобы преобразовать данные из столбцов в строки:

select t.userid, c.questionid, c.answer 
from yourtable t 
cross apply 
(
    values 
    ('QuestionId1', QuestionId1), 
    ('QuestionId2', QuestionId2), 
    ... 
) c (questionId, answer); 

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

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

select @colsUnpivot = stuff((select ','+quotename(C.name) 
     from sys.columns as C 
     where C.object_id = object_id('yourtable') and 
       C.name != 'userid' 
     for xml path('')), 1, 1, '') 

set @query 
    = 'select userid, questionid, answer 
    from yourtable 
    unpivot 
    (
     answer 
     for questionid in ('+ @colsunpivot +') 
    ) u' 

exec(@query); 

В качестве побочного примечания, когда вы выполняете этот тип преобразования, данные столбцов, преобразованных в строки, должны быть одного и того же типа данных. Например, если Question1 и Вопрос2 были разные типы данных, то вам нужно будет конвертировать их до до UNPIVOT похожее на это:

select userid, questionid, answer 
from 
(
    select userid, 
    cast(questionid1 as varchar(10)) questionid1, 
    cast(questionid2 as varchar(10)) questionid2 
    from yourtable 
) src 
unpivot 
(
    answer 
    for questionId in (QuestionId1, QuestionId2) 
) unpiv; 
1

Вы можете использовать UNPIVOT в MSSQL 2005 или выше:

SELECT [User ID], [Question ID], [Question Reponse] 
FROM 
    (SELECT [User ID], [Question 1], [Question 2] 
    FROM pvt) p 
UNPIVOT 
    ([Question Reponse] FOR [Question ID] IN 
     ([Question 1], [Question 2]) 
)AS unpvt; 

С : [Идентификатор пользователя] INT , [1] вопрос VARCHAR (100) , [вопрос 2] VARCHAR (100)

Результаты:

| USER ID | QUESTION ID | QUESTION REPONSE | 
-------------------------------------------- 
|  1 | Question 1 |    Blah | 
|  1 | Question 2 |   BlahBlah | 
|  2 | Question 1 |   MoreBlah | 
|  3 | Question 1 |  No Response | 
|  3 | Question 2 |    Else | 

SQL Fiddle

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