SSRS比较记录的多个详细信息行

时间:2013-12-19 23:26:13

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

这是我在SSRS面临的一个问题,我有点难过。这是我正在尝试创建的业务逻辑。

在确定实验室中正确的天数时,请使用以下逻辑:

如果案例中有多个具有相同BacklogGroup的详细信息项,则Daysinlab = Max(DaysinlabGDL)

如果项目来自不同的BackLogGroups,请从每个BackLogGroups中汇总DaysInLabGDL以获取DaysInLab金额。

例如:

Case ID         Back Log Group  Days    Calc Days
                                In Lab          
4595549         EMAX            5   7   
4595550         EMAX            5   2   
4595551         CLINICAL ZIRC   5   3   
4595552         BruxZir H       5   3   
4595559         Implant SS      5   4   
4595559         IMPLANTCA       8   8

我在Calc天使用的表达式是:

=iif(Fields!CaseID.Value = Previous(Fields!CaseID.Value) and Fields!BackLogGroup.Value <> Previous(Fields!BackLogGroup.Value),Fields!ActualDaysInLab.Value + Previous(Fields!ActualDaysInLab.Value),Max(Fields!ActualDaysInLab.Value))

本质上我要做的是比较一个案例中的详细记录,以及每个详细记录的积压组是否不同(可以有超过2个详细记录/案例)总结实验室列中的天数。如果详细记录的积压组相同,那么我想在实验室中获取天数的max()。

如果存在说3个详细记录和两个具有相同积压组的情况,则取最大值并将其添加到另一个。

因此,在上述情况下,caseID 4595559的计算天数应为13(5 + 8)两个详细信息。但由于某种原因,我没有得到那个。我结束了一个是4,一个是8。

如果它在这里有所不同,那么是创建数据集的SQL查询:

Declare @StartDate Datetime 
Declare @EndDate Datetime 
Set @StartDate = '12/01/2013'
Set @EndDate = GetDate()

SELECT      
        cp.CaseID
            ,c.DateIn
            ,c.DateInvoiced
            ,cp.ProductID
            ,p.BackLogGroup
            ,sra.SourceCategory
            ,sra.DaysInLabGDL
            ,DATEDIFF(DAY,c.DateIn,c.DateInvoiced) AS ActualDaysInLab
            ,dbo.GL_GetBusinessDayCount(c.DateIn,c.DateInvoiced) AS WorkingDays

FROM  dbo.CaseProducts cp WITH (NOLOCK)
            INNER JOIN dbo.Cases c WITH (NOLOCK)
                  ON cp.CaseID = c.CaseID
            LEFT OUTER JOIN dbo.Products p WITH (NOLOCK)
                  ON cp.ProductID = p.ProductID
            LEFT OUTER JOIN dbo.SalesReAllocation sra WITH (NOLOCK)
                  ON p.ProductID = sra.ProductID
WHERE 
p.BackLogGroup IS NOT NULL
AND 
c.DateInvoiced IS NOT NULL
AND        

c.DateIn between @StartDate and @EndDate

Order by 
cp.CaseID

我希望这很清楚。如果没有让我知道,我会尽力澄清。

提前致谢。

2 个答案:

答案 0 :(得分:0)

我正在调用您的第一个结果集t(为方便起见)。

我认为您的问题的解决方案是双重聚合:

select CaseId, sum(DaysInLab) as DaysInLab
from (select CaseID, BackLogGroup, max(DaysInLabGDL) as DaysInLab
      from t
      group by CaseId, BackLogGroup
     ) blg
group by CaseId;

答案 1 :(得分:0)

所以这是最终查询。感谢@Gordon Linoff的帮助。它让我走上了正确的道路。

Declare @StartDate Datetime 
Declare @EndDate Datetime 
Set @StartDate = '12/01/2013'
Set @EndDate = GetDate()
With t as
(
SELECT      
            --count(cp.caseID) as CaseCount
            cp.CaseID
            ,c.DateIn
            ,c.DateInvoiced
            ,cp.ProductID
            ,p.BackLogGroup
            ,sra.SourceCategory
            ,sra.DaysInLabGDL
            ,DATEDIFF(DAY,c.DateIn,c.DateInvoiced) AS ActualDaysInLab
            ,dbo.GL_GetBusinessDayCount(c.DateIn,c.DateInvoiced) AS WorkingDays

FROM  dbo.CaseProducts cp WITH (NOLOCK)
            INNER JOIN dbo.Cases c WITH (NOLOCK)
                  ON cp.CaseID = c.CaseID
            LEFT OUTER JOIN dbo.Products p WITH (NOLOCK)
                  ON cp.ProductID = p.ProductID
            LEFT OUTER JOIN dbo.SalesReAllocation sra WITH (NOLOCK)
                  ON p.ProductID = sra.ProductID
WHERE 
p.BackLogGroup IS NOT NULL
AND 
c.DateInvoiced IS NOT NULL
AND        
--cp.CaseID = 4595187
c.DateIn between @StartDate and @EndDate
)

select blg.CaseID, DateIn, DateInvoiced, sum(DaysInLab) as DaysInLab, blg2.BackLogGroup, blg2.Workingdays, blg2.Workingdays - sum(Daysinlab) as DaysOver
from (select CaseID, BackLogGroup, max(DaysInLabGDL) as DaysInLab, WorkingDays
      from t
      group by CaseId,  BackLogGroup, WorkingDays
     ) blg
     Inner Join (Select CaseID, DateIn, DateInvoiced, BackLogGroup, WorkingDays 
                 from t
                 group by CaseID, DateIn, DateInvoiced, BackLogGroup, WorkingDays
                 ) blg2 on blg.CaseID = blg2.CaseId

group by blg.CaseId, DateIn, DateInvoiced, blg2.BackLogGroup, blg2.Workingdays

having blg2.workingdays > sum(Daysinlab)