![](/img/trans.png)
[英]Transpose rows to columns - pivot in SQL Server 2008 using an id column
[英]Transpose / Pivot Rows to Columns in SQL Server
我有三個表 - 第一個包含具有唯一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
我在這里發現了一些非常好的線程,我一直在使用:
T-SQL Pivot / Unpivot(轉置)列標題需要數據行
還有一個:
我從以下方面提取了以下內容:
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)
感謝這篇文章的實現 - 用逗號作為分隔符將多行轉換為一行
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.