我有以下数据库表:
答案
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来处理它?</ p>
答案 0 :(得分:3)
您正在寻找数据透视 - 将列数据更改为行。旧学校的方法是使用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 。您需要先获取questionno列表,然后根据这些结果构建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声明中的逗号。
答案 1 :(得分:0)
我认为答案是否定的,因为您试图在显示器上运行QuestionNo列的值。因此,我认为您无法以这种方式创建SQL查询来表示数据。
也就是说,任何以这种方式重新呈现数据的客户端程序都应该是微不足道的,因为您只是转置数据。您不一定需要.NET程序。一个简单的脚本就足够了。
(考虑一下,如果你想使用T-SQL及其额外的流量控制,字符串操作,游标等,你可能会这样做。但是这种脚本编写更容易做到客户端程序。)
编辑:之前没有遇到过PIVOT(见其他答案)。看起来它会有所帮助,但需要一些工作。答案 2 :(得分:0)
您需要使用数据透视查询。微软有一些示例here,还有很多可以在Google上找到。