默认丢失数据

时间:2018-07-05 14:01:58

标签: sql reporting-services sql-server-2012

我有一组复杂的架构,我试图从中提取数据以生成报告。对于它的查询将一堆表连接在一起,我特别希望在其中所有数据都可能为空的数据子集中提取数据。这些表的原始关系看起来就是这样。

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已解决。

0 个答案:

没有答案