2017-06-23 52 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