用于显示db数据的SQL查询

时间:2009-09-24 06:13:21

标签: sql sql-server sql-server-2005 tsql

我有以下数据库表:

答案

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>

3 个答案:

答案 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上找到。