2014-04-18 7 views
0

У меня есть три таблицы - первый содержит вопросы с уникальным идентификаторомТранспонирование/Сводные Ряды столбцам в SQL Server

QID  | Question 
------------------ 
1  | Question 1 
2  | Question 2 
3  | Question 3 
4  | Question 4 
5  | Question 5 

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

QID  | Answer | Parent 
------------------------- 
1  | Yes | 123 
2  | No  | 123 
3  | No  | 123 
4  | Yes | 123 
5  | Yes | 123 
1  | No  | 124 
2  | Yes | 124 
3  | No  | 124 
4  | No  | 124 
5  | No  | 124 

Третий содержит другую информацию о материнской

Parent  |  Parent Title 
---------------------------------------- 
123  |  Questionnaire Sample 1 
124  |  Questionnaire Sample 2 

В идеале я хотел бы создать представление, которое переставляет или поворачивающийся данные в более удобном формате, я имею в виду что-то вдоль линий:

Parent  | Question 1  | Question 2  | Question 3  | Question 4  | Question 5 
123  | Yes   | No    | No    | Yes   | Yes 
124  | No    | Yes   | No    | No    | No 

Я нашел пару действительно хороших потоков здесь, что Я работаю с:

Simple way to transpose columns and rows in Sql?

T-SQL Pivot/Unpivot(Transpose) Column Headers Needed as Data Rows

был еще один:

Transpose rows into columns in SQL Server 2008 R2

, что я вытащил из следующих:

SELECT [First_Set], [Second_Set] 
FROM 
(
    SELECT B.ColumnName, A.Value 
    , row_number() over(partition by a.Table2ID 
        order by a.Value) seq 
    FROM Table_1 AS A 
    INNER JOIN Table_2 AS B 
    ON A.Table2ID = B.ID 
) AS P 
PIVOT 
(
    min(P.Value) 
    for P.ColumnName in ([First_Set], [Second_Set]) 
) AS PIV; 

Я модифицируется, что быть:

SELECT [PARENT], [QUESTION], [ANSWER] 
FROM 
(
    SELECT B.PARENT_TITLE, C.QUESTION, A.ANSWER 
    , row_number() over(partition by a.PARENT 
         order by a.PARENT) seq 
    FROM answerTable AS A 
    INNER JOIN parentTable AS B 
    ON A.PARENT = B.PARENT 
    INNER JOIN questionTable AS C 
    ON A.QID = C.QID  
) AS P 
PIVOT 
(
    min(P.RESULT) 
    for P.PARENT in ([PARENT], [QUESTION], [ANSWER]) 
) AS PIV; 

Который возвращается, но все еще не так мне нужен.

Невозможно создать новые таблицы, так что в идеале я ищу динамические средства здесь, это для отчетности, так что представление было бы самым легким/лучшим на мой взгляд, но я открыт для предложений.

Спасибо.

+1

Вы можете посмотреть на это http://stackoverflow.com/questions/23066846/how-do-i-use-pivot-on-this-data/23067210#23067210 –

ответ

2

Вот как сделать это динамически:

create table #t1(QID int, Question char(10)) 
insert #t1 values 
(1, 'Question 1'), 
(2, 'Question 2'), 
(3, 'Question 3'), 
(4, 'Question 4'), 
(5, 'Question 5') 

create table #t2 (QID int, Answer char(3), Parent int) 
insert #t2 values 
(1,  'Yes', 123), 
(2,  'No ', 123), 
(3,  'No ', 123), 
(4,  'Yes', 123), 
(5,  'Yes', 123), 
(1,  'No ', 124), 
(2,  'Yes', 124), 
(3,  'No ', 124), 
(4,  'No ', 124), 
(5,  'No ', 124) 

declare @collist nvarchar(max) 
SET @collist = stuff((select distinct ',' + QUOTENAME(Question) 
      FROM #t1 -- your table here 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 
select @collist 

declare @q nvarchar(max) 
set @q = ' 
select * 
from (
    select 
    Question, Answer, Parent 
     from (
     select #t1.*, #t2.Answer, #t2.parent 
     from #t1 
     inner join #t2 on #t1.QID = #t2.QID 
    ) as x 
) as source 
pivot (
    max(Answer) 
    for Question in (' + @collist + ') 
) as pvt 
' 

exec (@q) 
+0

Вау! Хорошо, это потрясающе - я смог поместить свои реальные имена таблиц и получить, что работает и возвращает данные для меня. Спасибо! Могу ли я построить это в представлении? Я только сделал базовое представление до сих пор ... может ли мой взгляд динамически строить временные таблицы каждый раз? –

+0

Нет, вы не можете создать из этого мнение. Вам придется применить это к каждому запросу. – dean

+0

Могу ли я сломать # t1/# t2 на отдельные ctes? –

0

Другой способ решения вашего вопроса -

declare @dynamicSQL varchar(max) = '' 
declare @pivotList varchar(max) = '' 
declare @uniqueQuestions table ([Question] varchar(50)) 
insert into @uniqueQuestions 
select distinct [Question] from Questions 
select @pivotList = @pivotList + '[' + Question + '],' from @uniqueQuestions 
set @pivotList = SUBSTRING(@pivotList, 0, LEN(@pivotList)) 
set @dynamicSQL = 
'select * 
from 
(
select Parent, Question, Answer 
from Questions as q 
left join Answers as a 
on q.QID = a.QID 
) as src 
pivot(
max(answer) 
for Question in (' + @pivotList + ')' + 
')as pvt' 
exec(@dynamicSQL) 

Благодаря этому сообщению, за его - Convert multiple rows into one with comma as separator

+0

Как мои таблицы связаны с таблицами @ dean - Question = # t1. Ответы = # t2. –

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