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 - 有没有一种方法可以根据表中指定值的行数动态输出列?的主要内容,如果未能解决你的问题,请参考以下文章