我正在使用的数据库是Microsoft SQL Server数据库。在这个数据库中,我有一份问卷表和一份问题表。表列中名为questionnaire_id的值是问卷表上的主键和问题表上的外键。每份问卷都可以包含任意数量的问题。我还有一张人员表和答案表。 question_id是问题表中的主键,person_id是person表上的主键,它们都是答案表上的外键。
我的目标是编写一个可以重复用于任何当前或未来调查问卷的查询。输出将包含每人一行,并且将包括人员表中的一些列以及每个问题一列和每个答案一列。如果我知道每个调查问卷上有多少问题,这很简单,但在这种情况下,我不知道。
理想情况下,我只想指定我想要生成报告的调查问卷的名称,而不必以任何其他方式更改查询。有谁知道我怎么能这样做?
答案 0 :(得分:0)
这必须通过动态创建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)
您必须更改表和字段名称,但这应该可以完成这项工作。