您正在寻找透视数据 - 将列数据更改为行。旧学校的方式是使用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语句的逗号。
我不认为PIVOT将能够使动态列比case语句更好。一种选择是生成动态SQL,然后执行它。 – tster 2009-09-24 06:28:58
如果用户可以自行添加问题该怎么办?我不能在sql中强制编码questionno。 – Billy 2009-09-24 06:32:00
我喜欢使用NULL来克服额外逗号的想法 - 比缩短字符串更好的解决方案。 *将文件留在大脑后部以供将来参考* – Billious 2009-09-25 01:48:10