条件查询以确定我的报告的状态

时间:2014-01-13 20:59:04

标签: sql sql-server

有一个视图需要计算报告的状态。然而它变得有点复杂,并寻求一些帮助。

示例数据: http://jsfiddle.net/ZpQ95/4/

在那个例子中,

报告1将被批准

报告2将被拒绝

报告3将等待

报告4将是草案

基本上我需要为此创建状态列。

  1. 如果所有5个角色都已批准(2),则报告已批准。
  2. 如果没有批准记录,则报告为草稿(1)。
  3. 如果有一些批准(2)且没有拒绝(3),那么报告将等待
  4. 如果有一个被拒绝(3)批准,那么该报告将被拒绝。
  5. c##1的示例 - 已批准:

    JobRoles.All(j => report.Approvals.Any(a => a.Role == j && a.Status == Approvals.Approved))
    

    c##2 - 草案的例子

    report.Approvals.Count == 0
    

    c##3的例子 - 待定

    !report.Approvals.Any(s => s.Status == Approvals.Denied) && report.Approvals.Count > 0
    

    c##4的示例 - 拒绝

    report.Approvals.Count > 0 && report.Approvals.Any(s => s.Status == Approvals.Denied)
    

    这将是我的主查询的子查询,它循环遍历所有报告:

    SELECT Id, FromDate, ToDate,
    (Status) FROM dbo.Reports AS EX
    WHERE  (IsDeleted = 0)
    

    调用状态表:dbo.Approvals

    SQL Server 2012

    谢谢:D 〜雅各布

1 个答案:

答案 0 :(得分:1)

您需要一个报告表和一个批准表,以便捕获没有Approvals的表。 所以我的解决方案看起来像这样这是我的SQLFiddle http://www.sqlfiddle.com/#!2/78070

select Reports.Report_id
,case
when exists(select * from Approvals Denied where 
               Denied.Report_id = Reports.Report_id
               and Denied.Status = 3)then
  'Denied'
when (Select count(Approvals.Report_id))=0 then
  'Draft'
when (Select count(Approvals.Report_id))<>5 then
  'Pending'
when (Select count(Approvals.Report_id))=5 then
  'Approved'
end
from Reports
left outer join Approvals
  on Reports.Report_id = Approvals.Report_id

group by
Reports.Report_id