2012-07-09 86 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