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

标签 sql sql-server database tsql

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

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

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

最佳答案

  1. 您必须选择参与要求的调查问卷的人员。因为人与答案相关联,答案与问题相关联,而问题与请求的问卷相关联,因此您需要所有表格来执行此操作。您还需要使用 DISTINCT 子句,因为一个人与许多答案相关联。
  2. 您必须选择与请求的调查问卷相关联的所有问题的 question_id
  3. 对于每个问题和每个人,您现在必须为问题表中的列创建一个子选择,并为答案表中的列创建另一个子选择。

这必须通过动态创建 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)

您将不得不更改表格和字段名称,但这应该可以完成工作。

关于sql - T-SQL - 有没有一种方法可以根据表中指定值的行数动态输出列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34190934/

相关文章:

node.js - 连接丢失时如何重新连接 SQL Server 乏味

c++ - 用于 *NIX C++ 的 SQL API

database - 在 Web 应用程序中,如何使数据库结构保持最新?

sql - 如何在Sql Server中删除没有属性的xml节点

MYSQL 简单数据建模

java - Spring boot 没有使用 spring 数据和 hibernate 与 sql server 一起运行

php - 如何自动解析 RSS 提要以存储在 MySQL 数据库中?

mysql - 如何在mysql中存储数据,以获得最快的性能?

mysql - 获取最大的城市人口

c# - 从数据库中获取数据的问题