2009-09-24 58 views
0

我有以下的数据库表: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来处理它?

回答

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语句的逗号。

+0

我不认为PIVOT将能够使动态列比case语句更好。一种选择是生成动态SQL,然后执行它。 – tster 2009-09-24 06:28:58

+0

如果用户可以自行添加问题该怎么办?我不能在sql中强制编码questionno。 – Billy 2009-09-24 06:32:00

+0

我喜欢使用NULL来克服额外逗号的想法 - 比缩短字符串更好的解决方案。 *将文件留在大脑后部以供将来参考* – Billious 2009-09-25 01:48:10

0

我认为答案是否定的,因为您试图在显示屏上运行QuestionNo列的值。所以我不认为你能够创建一个SQL查询来以这种方式表示数据。这就是说,任何以这种方式重新呈现数据的客户端程序应该是微不足道的,因为您只是转置数据。你不一定需要.NET程序。一个简单的脚本应该就足够了。如果你想使用T-SQL及其附加的流控制,字符串操作,游标等,你可能会这么做,但是这种脚本编写起来更容易。一个客户端程序。)

编辑:之前没有遇到过PIVOT(见其他答案)。看起来它会有所帮助,但需要一点工作。

0

您需要使用数据透视查询。微软有例子here,在Google上还有很多。

+0

如果用户可以自行添加问题该怎么办?我不能在sql中强制编码questionno。 PIVOT ( SUM(AnswerNo) FOR QuestionNo IN([I can not hard-code this]) )p – Billy 2009-09-24 06:40:49

+0

对于MS SQL,它需要eval'd SQL。这个例子在http://www.kodyaz.com/articles/t-sql-pivot-tables-in-sql-server-tutorial-with-examples。aspx(在“SQL中的动态数据透视表查询”一节中)看起来尽可能简单且合理。 – hobbs 2009-09-24 10:29:07