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

Используя мастер миграции MySQL Workbench, как я могу подключиться к моему MS SQL Server?

Профайлер SQL Server: захватывает вызовы хранимых процессов вашей базы данных во время генерации отчета SSRS

Приложение MS Access – преобразование данных из Access на SQL Server

SQL-запрос для возврата значения, основанного на хранении нескольких значений в других соответствующих столбцах

Удалить узлы XML в SQL-сервере на основе условий

Объединить строку с двумя столбцами в sql-сервере

Не удалось найти хранимую процедуру «dbo.aspnet_CheckSchemaVersion»

Выбрать и назначить переменную в одном выражении?

Выбор SQL Server выглядит как «Like»

SQL Query для обновления данных как UPPER CASE только 4-го слова?

SQL Server 2005 «общедоступная» роль базы данных, похоже, не применяется?

Скрипт с двумя переменными

обновляет таблицу с одинаковыми значениями, увеличивая файл журнала транзакций?

SQL Server / Azure DB – добавление JOIN замедляет запрос по секундам только для 180-строк

Оптимизация запросов в Delphi 4

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