我有一张表,如下表所示。此表包含有关学生的信息及其对一些多项选择题的答案。 考虑到每个考试中的问题数量可能会有所不同。
+--------+---------------+-------------+
| Person | QuestionIndex | ChoiceIndex |
+--------+---------------+-------------+
| John | 1 | 01 |
| John | 2 | 02 |
| John | 3 | 04 |
| Peter | 1 | 01 |
| Peter | 2 | 03 |
| Peter | 3 | 04 |
| Jack | 1 | 01 |
| Jack | 2 | 02 |
| Jack | 3 | 03 |
+--------+---------------+-------------+
现在,我想使用pivot将行更改为列,如下所示:
+--------+----+----+----+
| Person | Q1 | Q2 | Q3 |
+--------+----+----+----+
| John | 01 | 02 | 04 |
| Peter | 01 | 03 | 04 |
| Jack | 01 | 02 | 03 |
+--------+----+----+----+
哪些列是问题索引。并且每个字段在多项选择考试中保留用户对该问题的选择。
我想使用pivot来做到这一点。 有人可以帮忙吗?
答案 0 :(得分:1)
假设您的原始表是#temp:
declare @iterator int =1
declare @iterator2 varchar(max) = cast(@iterator as varchar(max))
declare @maxid int =(select max(questionindex) from #temp)
declare @exec varchar(max) = ''
declare @holding table (rowid int identity, string varchar(max))
while @iterator<=@maxid
begin
insert @holding
select 'max(case when questionindex='+@iterator2+' then choiceindex else null end)Q'+@iterator2+','
set @iterator=@iterator+1
end
select @maxid=max(rowid) from @holding
set @iterator =1
while @iterator<=@maxid
begin
select @exec= @exec+string from @holding where rowid=@iterator
set @iterator=@iterator+1
end
select @exec= 'select person, '+left(@exec, len(@exec)-1)+' from #temp group by person'
exec(''+@exec+'')
答案 1 :(得分:1)
您可以像以下代码一样使用+---+----------+----+
|id |day_id |diff|
+---+----------+----+
|id1|2017-11-21|167 |
|id1|2018-01-21|106 |
|id2|2017-12-21|137 |
+---+----------+----+
,我创建了一个名为&#39; cte_base&#39;的公用表表达式。分隔分组列,传播列和聚合列。然后我将PIVOT
应用于CTE的数据。
PIVOT