【问题标题】:SSRS Comparing multiple detail rows for a recordSSRS比较记录的多个详细信息行
【发布时间】:2013-12-19 23:26:12
【问题描述】:

这是我在 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

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

提前致谢。

【问题讨论】:

  • 将逻辑表达为 SQL 查询对您有帮助吗?
  • 是的。如果我能在 SQL 中做到这一点就更好了。

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


【解决方案1】:

我将您的第一个结果集称为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;

【讨论】:

  • 不确定我的原始查询是否适合此。我猜这就是你所说的?
  • @CraigBobchin 。 . .我认同。为了方便查询,您可以使用 CTE。
  • 所以我尝试将我的原始查询作为 t.这些是结果:CaseId DateIn DateInvoiced BacklogGroup DaysInLab WorkingDays 4595185 2013-12-02 09:45:00 2013-12-04 09:19:00 CLINICAL ZIRC COPH 3 3 4595186 2013-12-02 09:46:00 2013-12-04 14:02:00 CLINICAL ZIRC COPH 3 3 4595187 2013-12-02 09:58:00 2013-12-12 15:35:00 Implant BruxZir 7 9 4595187 2013-12-02 09:58:00 2013-12-12 15:35:00 IMPLANTCA 8 9 这个结果案例 4595187 两个详细记录都应该有 15 作为实验室天数 (7+8),而不是显示的原始值。无法确定格式。
  • 所以我把它放到了一个 CTE 中,当我只用你输入的字段运行它时,它就可以正常工作了。但是当我添加了所需的其余字段时,我发现它们恢复为初始值。我想知道我是否将它放入表变量中是否有帮助。欢迎提出任何建议。
【解决方案2】:

所以这是最终查询。感谢@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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多