SQL Query - 没有聚合函数的pivot

时间:2018-05-07 16:12:08

标签: sql sql-server-2008 pivot

我有一张表,如下表所示。此表包含有关学生的信息及其对一些多项选择题的答案。 考虑到每个考试中的问题数量可能会有所不同。

+--------+---------------+-------------+
| 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来做到这一点。 有人可以帮忙吗?

2 个答案:

答案 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