T-SQL - 有没有办法可以根据表中指定值的行数动态输出列?

时间:2015-12-09 23:23:19

标签: sql sql-server database tsql

我正在使用的数据库是Microsoft SQL Server数据库。在这个数据库中,我有一份问卷表和一份问题表。表列中名为questionnaire_id的值是问卷表上的主键和问题表上的外键。每份问卷都可以包含任意数量的问题。我还有一张人员表和答案表。 question_id是问题表中的主键,person_id是person表上的主键,它们都是答案表上的外键。

我的目标是编写一个可以重复用于任何当前或未来调查问卷的查询。输出将包含每人一行,并且将包括人员表中的一些列以及每个问题一列和每个答案一列。如果我知道每个调查问卷上有多少问题,这很简单,但在这种情况下,我不知道。

理想情况下,我只想指定我想要生成报告的调查问卷的名称,而不必以任何其他方式更改查询。有谁知道我怎么能这样做?

1 个答案:

答案 0 :(得分:0)

  1. 您必须选择参与所要求的调查问卷的人员。因为这些人与答案相关联,并且答案与问题相关联,并且问题与所请求的问卷相关联,所以您需要所有表来执行此操作。您还需要使用DISTINCT子句,因为一个人与许多答案相关联。
  2. 您必须选择与所请求的调查问卷相关的问题的所有问题
  3. 对于每个问题和每个人,您现在必须为问题表中的列创建子选择,并为答案表中的列创建另一个子选择。
  4. 这必须通过动态创建SQL语句来完成。见这个例子:

    DECLARE @questionnaire INT
    DECLARE @qa VARCHAR(MAX)
    DECLARE @Sql AS VARCHAR(MAX)
    
    SET @questionnaire = 1
    SELECT  @qa = COALESCE(@qa,'')  + 
    '
    , (select q.text 
    from t_answer a
    join t_question q
        on q.question_id = a.question_id
    where q.question_id=' + CAST(q.question_id AS VARCHAR(10)) + '
    and a.person_id = p.person_id) as question'+  CAST(q.question_id AS VARCHAR(10)) +
    '
    , (select a.text 
    from t_answer a
    where a.question_id=' + CAST(q.question_id AS VARCHAR(10)) + '
    and a.person_id = p.person_id) as answer'+  CAST(q.question_id AS VARCHAR(10)) 
    
    FROM t_question q
    WHERE q.questionnair_id=@questionnaire
    
    SET @sql = 'select distinct p.name ' + @qa + '
    from t_person p
    join t_answer a
        on a.person_id = p.person_id
    join t_question q
        on q.question_id = a.question_id
    join t_questionnaire r
        on r.questionnair_id = q.questionnair_id
    where r.questionnair_id=' + CAST(@questionnaire AS VARCHAR(10))
    
    PRINT @sql
    
    --EXECUTE (@sql)
    

    您必须更改表和字段名称,但这应该可以完成这项工作。