SQL-запрос для отображения данных db

У меня есть следующая таблица базы данных:

Ответ

MemberID | QuestionNo | AnswerNo | AnswerString 10 | 1 | 2 | q1 anwer2 10 | 2.1 | 3 | q2.1 answer3 10 | 2.2 | 5 | q2.2 answer5 10 | 7 | 1 | q7 answer 7 11 | 1 | 3 | q1 anwer 3 11 | 3 | 1 | q3 answer 1 11 | 5 | 4 | q5 anwer 4 

Каждый член отвечает на разные вопросы, основываясь на ответах предыдущих вопросов. Я хочу показать ответ в следующем формате

 MemberID | 1 | 2.1 | 2.2 | 3 | 5 | 7 10 | 2 | 3 | 5 |NULL |NULL| 1 11 | 3 |NULL |NULL | 1 | 4 |NULL 

Могу ли я это сделать только в SQL Server 2005? Или мне нужно использовать ASP.net для его обработки?

Вы ищете сводные данные – изменение столбчатых данных в строки. Старый способ школы – использовать операторы CASE – с SQL Server 2005 вы можете использовать команду PIVOT . Я оставлю его кому-то другому, чтобы представить пример PIVOT.

 SELECT t.memberid, CASE WHEN t.questionno = 1 THEN t.answerno ELSE NULL END AS 1, CASE WHEN t.questionno = 2.1 THEN t.answerno ELSE NULL END AS 2.1, CASE WHEN t.questionno = 2.2 THEN t.answerno ELSE NULL END AS 2.2, CASE WHEN t.questionno = 3 THEN t.answerno ELSE NULL END AS 3 CASE WHEN t.questionno = 5 THEN t.answerno ELSE NULL END AS 5 CASE WHEN t.questionno = 7 THEN t.answerno ELSE NULL END AS 7 FROM ANSWER t 

Мне непонятно, что такое тип данных столбца questionno, при необходимости обновляйте обновления.

Если пользователи могут определить свои собственные вопросы, вы должны использовать динамический SQL . Вам нужно сначала получить список вопросов, а затем построить инструкции CASE на основе этих результатов. Также для PIVOT …

 DECLARE @SQL nvarchar(4000) DECLARE @questionno [data type here] SET @SQL = 'SELECT t.memberid,' DECLARE c1 CURSOR READ_ONLY FOR SELECT t.questionno FROM ANSWER t GROUP BY t.questionno ORDER BY t.questionno OPEN c1 FETCH NEXT FROM c1 INTO @questionno WHILE @@FETCH_STATUS = 0 BEGIN SET @SQL = @SQL + ' CASE WHEN t.questionno = '+ @questionno +' THEN t.answerno ELSE NULL END AS '+ @questionno',' FETCH NEXT FROM c1 INTO @questionno END CLOSE c1 DEALLOCATE c1 SET @SQL = @SQL + 'NULL FROM ANSWER t ' EXEC(@SQL) 

NULL FROM … потому что я слишком ленив, чтобы избавиться от запятой, которая исходит из последнего оператора CASE.

Вам нужно использовать сводный запрос. В Microsoft есть примеры, и в Google есть еще много чего.

Я думаю, что ответ отрицательный, потому что вы пытаетесь запустить значения столбца QuestionNo на вашем дисплее. Поэтому я не думаю, что вы сможете создать SQL-запрос для представления данных таким образом.

Тем не менее, любая клиентская программа для повторного представления данных таким образом должна быть тривиальной, поскольку вы просто переносите данные. Вам не обязательно нужна программа .NET. Достаточно простого сценария.

(Думая об этом немного больше, если вы хотите использовать T-SQL с дополнительным управлением потоком, строковыми операциями, курсорами и т. Д., Возможно, вы это сделаете. Но такого рода сценарии было бы проще сделать в клиентской программе. )

EDIT: Раньше не встречался PIVOT (см. Другие ответы). Похоже, это поможет, но требует немного работы.

Interesting Posts

Использование INDEX в SQL Server

Как работает Non-Clustered index, когда у него много ключей с одинаковым значением

Удалить повторяющиеся записи из таблицы

Как вернуть случайные числа в качестве столбца в SQL Server 2005?

Добавьте еще один первичный ключ в таблицу UNIQUE

Как отправить HTTP или XML / RPC-запрос из SQL Server хранимой процедуры / триггера?

Как EXEC хранится процедура, используя значения из таблицы

Группа по возрасту, рассчитанная с даты рождения SQL Server

Создание данных по умолчанию в проектах базы данных Visual Studio / SQL Server

Обновление SQL. Зафиксируйте каждую строку в порядке.

дизайн базы данных для настроек уведомлений

Как создать набор правил на основе базы данных для системы достижения веб-приложений?

Можно ли добавить столбец к существующему кластерному индексу в sql-сервере?

Как показать выполнение заказа в запросе SQL Server 2008

Использование SQL Server, пытающегося выполнить ORDER BY, используя Casting SUBSTRING to INT

Давайте будем гением компьютера.