我有一组复杂的架构,我试图从中提取数据以生成报告。对于它的查询将一堆表连接在一起,我特别希望在其中所有数据都可能为空的数据子集中提取数据。这些表的原始关系看起来就是这样。
Location.DeptFK
Dept.PK
Section.DeptFK
Subsection.SectionFK
Question.SubsectionFK
Answer.QuestionFK, SubmissionFK
Submission.PK, LocationFK
从这里开始,我的问题开始变得有些复杂。
SELECT Section.StepNumber + '-' + Question.QuestionNumber AS QuestionNumberVar,
Question.Question,
Subsection.Name AS Subsection,
Section.Name AS Section,
SUM(CASE WHEN (Answer.Answer = 0) THEN 1 ELSE 0 END) AS NA,
SUM(CASE WHEN (Answer.Answer = 1) THEN 1 ELSE 0 END) AS AnsNo,
SUM(CASE WHEN (Answer.Answer = 2) THEN 1 ELSE 0 END) AS AnsYes,
(select count(distinct Location.Abbreviation) from Department inner join Plant on location.DepartmentFK = Department.PK WHERE(Department.Name = 'insertParameter'))
as total
FROM Department inner join
section on Department.PK = section.DepartmentFK inner JOIN
subsection on Subsection.SectionFK = Section.PK INNER JOIN
question on Question.SubsectionFK = Subsection.PK INNER JOIN
Answer on Answer.QuestionFK = question.PK inner JOIN
Submission on Submission.PK = Answer.SubmissionFK inner join
Location on Location.DepartmentFK = Department.PK AND Location.pk = Submission.PlantFK
WHERE (Department.Name = 'InsertParameter') AND (Submission.MonthTested = '1/1/2017')
GROUP BY Question.Question, QuestionNumberVar, Subsection.Name, Section.Name, Section.StepNumber
ORDER BY QuestionNumberVar;
总共有15个位置,通过此查询,我得到12个位置。如果我删除位置的联接中的关系,我将得到15个位置,但答案数据却乘以15。我的问题是,并非所有位置都需要同时进行测试,因此他们的答案应默认为NA。他们不会将记录放置在数据库中,因此位置/提交之间的关系不存在。
我几乎可以通过选择计数来解决问题,但是,第二部分是一个查询,用于查找每个位置的答案,而不是总和,从而使问题立即解决。它还必须是动态的,因为部门的输入参数不会每次都带回固定数量的位置。
我仍在学习我的SQL,因此,任何其他有关构建此查询的材料也将不胜感激。因此,我想这里的主要问题是,无论位置/提交关系是否为空值,如何在此查询中创建默认数据?
编辑:虚拟数据
QuestionNumberVar | Section | Subsection | Question | AnsYes | AnsNo | NA (expected)
1-1.1 Math Algebra Did you do your homework? 10 1 1(4)
1-1.2 Math Algebra Did your dog eat it? 9 3 0(3)
2-1.1 English Greek Did you do your homework? 8 0 4(7)
我尝试在代码的各个适用部分进行左联接,但无济于事。所有左联接尝试均已结束,对信息输出无影响。该查询将馈入SSRS报告的数据集。对于该特定部分,有两种解决方法,可以通过表达式获取总位置并减去AnsYes和AnsNo以获取真实的NA值,但是如上所述对我的下一个查询没有帮助。
编辑:SQL Server 2012供那些问过的人
编辑:我尝试对丢失的数据执行isull()不会返回我怀疑的任何内容,因为查询已经消除了“空/缺失”数据。这样做时左联接也失败了。失败的重点在于提交。如果我们将其绑定到“位置”,则会丢失一些位置,但是如果我们不将其绑定,则会出现重复的重复项,因为Department的位置与位置是一对多的,反之亦然。我无法进行任何架构更改来改进此过程。
我正在尝试模拟/更新以前的报告。它使用C#逻辑来处理数据并运行多个查询以获取相同的数据。我没有这种奢侈。 (以前的报告直接导出到excel,而不是SSRS)。这是以前使用的逻辑。
select PK from Department where Name = 'InsertParameter';
select PK from Submission where LocationFK = 'Location.PK_var' and MonthTested = '1/1/2017'
然后将它们运行到循环中,在循环中使用C#逻辑将空值处理为NA
EDIT(平庸的解决方案):我最终做了一个变通方法,使计算所得的字段从具有该部门的位置总数中减去Yes和No。这是一个平庸的解决方案,因为我没有解决我原来的问题并制作了3个应显示为单个数据集的数据集。一个用于问题信息,一个用于每个位置的答案,一个用于不参与的位置。如果给出了正确的答案,我将检查其有效性,但现在,问题psuedo已解决。