首页 > 解决方案 > 默认缺失数据

问题描述

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

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,他们不会将记录放在数据库中,因此位置/提交之间的关系不存在。

我通过 select count distinct 几乎有一个解决方法,但是,第二部分是一个查询,用于查找每个位置回答的内容,而不是总和,这会使问题重新出现。它还必须是动态的,因为部门的输入参数不会每次都带回静态数量的位置。

我仍在学习我的 SQL,因此对于构建此查询的任何其他材料也将不胜感激。所以我想这里的一个大问题是,我将如何在此查询中创建默认数据,以便在 Location/Submission 关系具有空值的任何时候?

编辑:虚拟数据

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 适合那些询问的人

编辑:我对缺失数据的 isnull() 尝试没有返回任何我怀疑的结果,因为查询已经消除了“空/缺失”数据。这样做时离开加入也失败了。失败点在于提交。如果我们将其绑定到 Locations,则会丢失位置,但如果我们不绑定它,则会出现重复的重复项,因为 Department 与 Location 具有一对多,反之亦然。我无法进行任何架构更改来改进此过程。

我正在尝试模拟/更新以前的报告。它使用 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

编辑(平庸的解决方案):我最终解决了制作一个计算字段的方法,该字段从具有该部门的位置总数中减去是和否。这是一个平庸的解决方案,因为我没有解决我原来的问题并做了 3应显示为单个数据集的数据集。一个用于问题信息,一个用于每个位置的答案,一个用于未参与的位置。如果出现真正的答案,我会检查它的有效性,但现在,问题 psuedo 解决了。

标签: sqlreporting-servicessql-server-2012

解决方案


推荐阅读