这是我在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
我希望这很清楚。如果没有让我知道,我会尽力澄清。
提前致谢。
答案 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)