2012-07-09 58 views
0

我有许多表中有关用户对特定课程所有问题的回复的数据的代码。回复如下所示:SQL Server:将多行的高级报告合并为一个

userid|lesson|question |response|label|weight|duration_seconds 
======================================================================== 
bob |first |loc_nameA|4  |R9 |3.5 |189 
bob |first |loc_nameB|2  |R7 |4.5 |113 
… 

需要报告显示所有响应显示在一行中。因此,对于每个问题,我需要与它的相应的标签,重量和持续时间这样沿着显示响应到柱:

userid|lesson|1_resp|1_labl|1_weig|1_dura|2_resp|3_labl|3_weig|3_dura|4_resp… 
======================================================================== 
bob |first |4  |R9 |3.5 |189 |2  |R7 |4.5 |113 |1 

或通过使用“问题”的列值作为动态列 名称的一部分交替地。目前,它们都具有逻辑名称,如L1Q1所以只是1,2,3足以作为列名,但是这可能不会总是这样的情况:

userid|lesson|loc_nameA_resp|loc_nameA_labl|loc_nameA_weig|loc_nameA_dura|loc_nameB_resp|loc_nameB_labl|loc_nameB_weig|loc_nameB_dura|loc_nameC_resp… 
================================================================================================================================================ 
bob |first |4    |R9   |3.5   |189   |2    |R7   |4.5   |113   |1 

我一直在阅读有关数据透视表,但所有的例子似乎较为有限比我所描述的要多。 SQL Server 2005如何做到这一点?我应该使用别的东西吗?有更容易的方法吗?

+0

请告诉我们为什么他们看起来错了。你也可以告诉我们使这两个输出成为它们的方式的规则。很难确定快照的要求。最后这需要报告。你在找什么(1)sql(2)如何布局(3)其他 – 2012-07-09 22:27:27

回答

1

你可以使用动态SQL来解决这个问题 - 或者如果只是为了一组数据而手工编写它。在这两种情况下,你要的东西,看起来像这样结束了:

SELECT R1.userid, R1.lesson, 
     R1.response as loc_nameA_resp, R1.lable as loc_nameA_labl, R1.weight as loc_nameA_weig, R1.duration_seconds as loc_nameA_dura, 
     R2.response as loc_nameB_resp, R2.lable as loc_nameB_labl, R2.weight as loc_nameB_weig, R2.duration_seconds as loc_nameB_dura, 
--- etc for each question 
FROM user U 
JOIN response R1 on R1.userid = u.userid and R1.lesson = 'first' and R1.question = 'loc_nameA' 
JOIN response R2 on R2.userid = u.userid and R2.lesson = 'first' and R2.question = 'loc_nameB' 
--- etc for each question 
WHERE 
    U.userid = 'bob' -- this does not need to be bob, whatever user you want. 

在这里你去,经过测试,应有尽有。

DECLARE @sqlSelectList varchar(max); 
DECLARE @sqlJoinList varchar(max); 

SELECT @sqlSelectList = '', @sqlJoinList=''; 

WITH Questions AS 
(
    SELECT DISTINCT question 
    FROM ResultsChoices 
) 
SELECT -- We use the question as the alias for join uniqueness, 
     -- We could increment a number but why bother? 
    @sqlJoinList = @sqlJoinList + 
    ' JOIN ResultsChoices '+question+' on '+question+'.userid = u.userid and '+question+'.question = '''+question+'''', 
    @sqlSelectList = @sqlSelectList + 
    ', '+question+'.response as '+question+'_resp, '+question+'.label as '+question+'_labl, '+question+'.weight as '+question+'_weig, '+question+'.duration_seconds as '+question+'_dura ' 
FROM Questions; 

DECLARE @sql NVARCHAR(max); 

SET @sql = N'SELECT DISTINCT u.userid ' + @sqlSelectList + N' FROM #ResultsChoices u ' + @sqlJoinList; 

EXEC sp_executesql @sql 
+0

我会试试这个。但是我知道它需要更具活力。任何方式来做这个作为一个函数或过程,我不知道什么“问题”字符串将是?没有必要的条款。 – gooddadmike 2012-07-10 04:44:25

+0

是的,正在使用动态sql。给它一个镜头 – Hogan 2012-07-10 11:22:39

+0

如果你想我的帮助设置一些示例数据和你到目前为止在这里http://sqlfiddle.com/ – Hogan 2012-07-10 12:18:45