【问题标题】:Storing survey data in SQL database在 SQL 数据库中存储测量数据
【发布时间】:2017-06-23 16:18:13
【问题描述】:

我们有一个小型表单托管应用程序,其中不同表单的答案数量不同。存储表单答案的当前表结构如下。

-------------------------------------------------- ---------- |Survay_Id |问题_ID |提交_id |答案 | | 1 | 1 | 123 |测试 1 | | 1 | 2 | 123 |测试 2 | | 1 | 1 | 124 |制表符 | | 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) 查询以生成一种调查提交报告的最佳方式是什么。我需要类似的东西

---------------------------------- |调查编号 |答案 1 |回答2| | 1 |测试 1 |测试 2 | | 1 |制表符 | xyza | ---------------------------------- --------------------------------------------- |调查编号 |答案 1 |回答2|答案 3 | | 2 | xsfa | xsgffa | xsffa | | 2 | xsffa | xssdgffa| xsdffa | ----------------------------------

我们可以将表格转置到上面的视图中。有什么好的方法吗?

如果它有助于数据库是 MSSQL 服务器

【问题讨论】:

标签: sql sql-server database database-design


【解决方案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,'+@COLUMNS+' 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('+@COLUMNS+')
)PV'

--PRINT @SQL

EXEC (@SQL)

结果:

+-----------+----------+----------+----------+
| 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   |
+-----------+----------+----------+----------+

【讨论】:

    【解决方案2】:

    对于第一个输出

    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
    

    第二个输出

    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
    

    【讨论】:

      猜你喜欢
      • 2011-07-25
      • 2014-07-21
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 2019-04-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多