2017-06-23 84 views
-2

我們有一個小型表單託管應用程序,其中不同形式的答案數量不同。當前表格結構存儲表單的答案如下。將調查數據存儲在SQL數據庫中

 
------------------------------------------------------------ 
|Survay_Id | question_ID | submission_id | answer   | 
| 1   | 1   | 123   | test 1   | 
| 1   | 2   | 123   | test 2   | 
| 1   | 1   | 124   | tabc   | 
| 1   | 2   | 124   | xyza   | 
| 2   | 3   | 125   | xsfa   | 
| 2   | 4   | 125   | xsgffa   | 
| 2   | 5   | 125   | xsffa   | 
| 2   | 3   | 126   | xsffa   | 
| 2   | 4   | 126   | xssdgffa  | 
| 2   | 5   | 126   | xsdffa   | 
----------------------------------------------------------- 

調查1有兩個問題,調查2有三個問題。通過提交ID來識別唯一的提交。 問題

1)如果需要,我可以稍微改變數據庫結構。但它必須是SQL。因爲MongoDB尚未被批准使用。有沒有更好的結構。

2)查詢生成一種調查提交報告的最佳方式是什麼?我需要類似

 
---------------------------------- 
|survery id | answer 1 | answer 2| 
| 1   | test 1 | test 2 | 
| 1   | tabc  | xyza | 
----------------------------------- 

--------------------------------------------- 
|survery id | answer 1 | answer 2| answer 3 | 
| 2   | xsfa  | xsgffa | xsffa | 
| 2   | xsffa | xssdgffa| xsdffa | 
----------------------------------- 

我們可以將錶轉換爲上述視圖。有什麼好辦法做到這一點?

如果它可以幫助數據庫是MSSQL服務器

+0

我認爲你需要使用樞 –

+0

請參閱相關的信息這樣的問題:https://開頭計算器。 COM /問題/ 14708587 /選擇列值-AS-列-使用樞軸 – Turophile

回答

1

您需要使用動態旋轉..

模式:

CREATE TABLE #TAB(Survay_Id INT, question_ID INT, submission_id INT, answer VARCHAR(50)) 
INSERT INTO #TAB 
SELECT 1, 1, 123, 'test 1' 
UNION ALL 
SELECT 1, 2, 123,'test 2' 
UNION ALL 
SELECT 1, 1,124,'tabc' 
UNION ALL 
SELECT 1, 2, 124,'xyza' 
UNION ALL 
SELECT 2, 3, 125,'xsfa' 
UNION ALL 
SELECT 2, 4, 125,'xsgffa' 
UNION ALL 
SELECT 2, 5, 125,'xsffa' 
UNION ALL 
SELECT 2, 3, 126,'xsffa' 
UNION ALL 
SELECT 2, 4, 126,'xssdgffa' 
UNION ALL 
SELECT 2, 5, 126,'xsdffa' 

現在使用動態樞紐如下

DECLARE @SQL VARCHAR(MAX)='',@COLUMNS VARCHAR(MAX)=''; 

--preparing column list to use in pivot 
SELECT @COLUMNS = @COLUMNS+ ANS_ID FROM(
SELECT DISTINCT '[answer '+ 
CAST(ROW_NUMBER() 
     OVER(PARTITION BY SUBMISSION_ID 
      ORDER BY (question_ID)) AS VARCHAR(5))+'],' AS ANS_ID 
      FROM #TAB 
)A 


SELECT @COLUMNS = LEFT(@COLUMNS, LEN(@COLUMNS)-1) 


--Dynamic Pivot Part 
SELECT @SQL = 
'SELECT Survay_Id,'[email protected]+' FROM (
SELECT Survay_Id,ANSWER, submission_id 
, ''answer '' 
+ CAST(ROW_NUMBER() 
     OVER( PARTITION BY SUBMISSION_ID 
      ORDER BY (question_ID)) AS VARCHAR(5)) AS ANS_ID 
FROM #TAB 
)A 
PIVOT 
(
    MAX(ANSWER) for ANS_ID IN('[email protected]+') 
)PV' 

--PRINT @SQL 

EXEC (@SQL) 

Res ULT:

+-----------+----------+----------+----------+ 
| Survay_Id | answer 1 | answer 2 | answer 3 | 
+-----------+----------+----------+----------+ 
|   1 | test 1 | test 2 | NULL  | 
|   1 | tabc  | xyza  | NULL  | 
|   2 | xsfa  | xsgffa | xsffa | 
|   2 | xsffa | xssdgffa | xsdffa | 
+-----------+----------+----------+----------+ 
0

對於第一次輸出

SELECT Survay_Id,[answer 1],[answer 2] 
FROM (SELECT Survay_Id,answer, submission_id, 'answer ' 
+CAST(ROW_NUMBER() OVER(PARTITION BY submission_id ORDER BY (question_ID)) AS VARCHAR(5)) as ans 
FROM TableName where Survay_Id = 1)test 
PIVOT 
(MAX(answer) for ans IN([answer 1],[answer 2]))PIV 

對於第2個輸出

SELECT Survay_Id,[answer 1],[answer 2],[answer 3] 
FROM (SELECT Survay_Id,answer, submission_id, 'answer ' 
+CAST(ROW_NUMBER() OVER(PARTITION BY submission_id ORDER BY (question_ID)) AS VARCHAR(5)) as ans 
FROM TableName where Survay_Id = 2)test 
PIVOT 
(MAX(answer) for ans IN([answer 1],[answer 2],[answer 3]))PIV