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

Posted

技术标签:

【中文标题】T-SQL - 有没有一种方法可以根据表中指定值的行数动态输出列?【英文标题】:T-SQL - Is there a way that I can dynamically output columns based on the number of rows for a specified value in a table? 【发布时间】:2015-12-09 23:23:18 【问题描述】:

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

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

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

【问题讨论】:

我认为 PIVOT 可以做到这一点。 technet.microsoft.com/en-us/library/ms177410(v=sql.105).aspx 听起来你将不得不使用 PIVOT。 当使用pivot时,你需要指定哪些列应该被pivot,因此对于未知数量的列(如本例),你需要编写动态查询来构造pivot,然后使用sqlexecute运行它。 【参考方案1】:
    您必须选择参与所要求问卷的人员。因为这些人与答案相关联,而答案与问题相关联,而问题与所请求的调查问卷相关联,您将需要所有表格来执行此操作。您还需要使用 DISTINCT 子句,因为一个人与许多答案相关联。 您必须选择与请求的问卷相关的所有问题的 question_id 对于每个问题和每个人,您现在必须为问题表中的一列创建一个子选择,并为答案表中的一列创建另一个子选择。

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

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

【讨论】:

以上是关于T-SQL - 有没有一种方法可以根据表中指定值的行数动态输出列?的主要内容,如果未能解决你的问题,请参考以下文章

php删除数组中指定值的元素

%in% 的对面:排除具有向量中指定值的行

php获取数组中指定值的下标

MongoDB JAVA API Filters

js数组的处理

如何在属性文件中指定值,以便可以使用 ResourceBundle#getStringArray 检索它们?