将SQL Server中的行/数据透视转换为列

将SQL Server中的行/数据透视转换为列,sql,sql-server,transpose,Sql,Sql Server,Transpose,我有三个表-第一个表包含具有唯一ID的问题 QID | Question ------------------ 1 | Question 1 2 | Question 2 3 | Question 3 4 | Question 4 5 | Question 5 第二个表包含这些问题的答案,第一个表中的唯一ID,然后是将答案链接在一起的记录的ID QID | Answer | Parent -

我有三个表-第一个表包含具有唯一ID的问题

QID     | Question  
------------------  
1       | Question 1  
2       | Question 2  
3       | Question 3  
4       | Question 4  
5       | Question 5  
第二个表包含这些问题的答案,第一个表中的唯一ID,然后是将答案链接在一起的记录的ID

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
我在这里找到了几个我一直在使用的非常好的线程:

还有一个:

我从中得出以下结论:

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;
它回来了,但仍然不是我需要的

对我来说,创建新表是不可行的,所以理想情况下,我在这里寻找一种动态方法,它是用于报告的,因此我认为视图最容易/最好,但我愿意接受建议


谢谢。

以下是如何动态执行此操作:

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)

另一种解决问题的方法-

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)

感谢这篇文章让它成为现实-

你可以寻找这个魔兽世界!好的,这太棒了——我能够输入我的真实表名,并为我得到工作和返回数据。非常感谢。但是,我能将其构建到视图中吗?到目前为止,我只做了基本的视图构建。。。“我的视图”每次都可以动态地构建临时表吗?不,不能从中创建wiev。您必须将此应用于每个查询。我可以将t1/t2分解为单独的CTE吗?它们在两个单独的select语句中使用,其中一个在动态范围中,因此您不能t@dean-与我用来创建列列表的代码相比,使用for xml path有什么优势吗?我想知道为什么人们使用xml路径。从问题集@pivotList=SUBSTRING@pivotList, 0, LEN@pivotListHow我的表格与@dean的表格相关-问题=t1。答案=t2。