SQL Query - сводка без агрегатной функции - PullRequest
0 голосов
/ 07 мая 2018

У меня есть таблица, которая выглядит как таблица, приведенная ниже. Эта таблица содержит информацию о студентах и ​​их ответы на некоторые вопросы с несколькими вариантами ответов. Учтите, что количество вопросов может быть разным на каждом экзамене.

+--------+---------------+-------------+
| 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 |
+--------+---------------+-------------+

Теперь я хотел бы изменить строки на столбцы, используя сводную диаграмму, такую ​​как эта:

+--------+----+----+----+
| Person | Q1 | Q2 | Q3 |
+--------+----+----+----+
| John   | 01 | 02 | 04 |
| Peter  | 01 | 03 | 04 |
| Jack   | 01 | 02 | 03 |
+--------+----+----+----+

Какие столбцы являются индексами вопросов. и каждое поле содержит выбор пользователя для этого вопроса в экзамене с несколькими вариантами ответов.

Я бы хотел сделать это с помощью pivot. Кто-нибудь может помочь сделать это?

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Вы можете использовать PIVOT, как в следующем коде, я создал общее табличное выражение с именем 'cte_base', которое разделяет столбец группировки, столбец расширения и столбец агрегации.Затем я применил PIVOT к данным из CTE.

WITH cte_base AS(
SELECT Person,      --Grouping column
QuestionIndex,      --Spreading column
ChoiceIndex         --Aggregation column
FROM tablename)
SELECT person, 
[01] AS 'Q1',
[02] AS 'Q2',
[03] AS 'Q3'
FROM cte_base
PIVOT (MAX(ChoiceIndex) 
FOR QuestionIndex IN ([01],[02],[03]));
0 голосов
/ 07 мая 2018

Предполагая, что ваша исходная таблица #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+'')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...