我已经问了一个类似的问题here并得到jpw帮助我查询的帮助。这里的情况仍然相同,但只增加了一些细节。我有四张桌子。其中三个的样本结构如下:
我已经帮助形成查询,如下所示:
select
d.LOTQty,
ApprovedQty = count(d.SerialNo),
d.DispatchDate,
Installed = count(a.SerialNo) + count(r.SerialNo)
from
Despatch d
left join
Activation a
on d.SerialNo= a.SerialNo
and d.DispatchDate <= a.ActivationDate
and d.LOTQty = a.LOTQty
left join
Replaced r
on d.SerialNo= r.SerialNo
and d.DispatchDate <= r.ActivationDate
and (a.ActivationDate is null or a.ActivationDate < d.DispatchDate)
where
d.LOTQty = 15
group by
d.LOTQty, d.DispatchDate, d.STBModel
为了便于理解,上述查询与 Despatch
表匹配 SerialNo
表格Activation
。如果匹配,则检查日期差异。如果DespatchDate < ActivationDate
仅考虑这些数字,而其他数字(不匹配或其DispatchDate > ActivationDate
)与替换时使用相似的日期条件匹配。所以最后我们找到9个匹配,即来自 Activation
的7个匹配,以及来自 Replaced
的2个匹配,如下所示:
LotQty | ApprovedQty | DispatchDate | Installed
15 | 10 | 2013-8-7 | 9
我想在这里再显示两列,即 DOA
和 Bounce
,如下所示:
LotQty | ApprovedQty | DispatchDate | Installed | DOA | Bounce
15 | 10 | 2013-8-7 | 9 | 2 | 4
DOA和Bounce应根据第4个表格进行计算,即 Failed
表格FailedDate
以及上述9个匹配的SerialNo相应的激活/记录日期(以下称为act_rec_date)。 Failed
表格与中级9匹配的SerialNo结构如下所示:
Intermediate
表格实际上并不存在。它仅供参考,并提供更清晰的信息。 Intermediate
表包含与 SerialNo
和 Activation
匹配的Replaced
表。 act_rec_Date
字段相应地匹配激活/记录日期。
Failed
表匹配。如果匹配,请计算FailedDate
和act_rec_date
之间的差异。如果差异为 (0 to <=10 days)
,则将其计入DOA
,如果差异为 (>10 days to <=180 days)
,则将其计入Bounce
。从 Failed
我们找到6个匹配,其中Product1,2属于DOA
,因为act_rec_Date之间的差异为0,而Product7,8,9&amp; 10属于Bounce
,因为他们的差异为89 | 54 | 61 | 61
。如上所示 DOA = 2
和 Bounce = 4
我想构建一个可以给我DOA和Bounce的查询。我尝试创建一个临时表,并将生成的SerialNo&#39; s和act_rec_Date转储到其中。接下来我尝试匹配临时表和失败表。我无法让它工作,甚至还需要大约7分钟来执行查询。
P.S-我的实际表包含大约50k到100k的数据条目。
答案 0 :(得分:0)
继续上一个查询,我认为新列可以在select语句中添加条件聚合,为失败表添加另一个左连接。
这应该可行,但我确定可以改进查询:
select
d.LOTQty,
ApprovedQty = count(d.SerialNo),
d.DispatchDate,
Installed = count(a.SerialNo) + count(r.NewSerialNo),
DOA = sum(case when datediff(day, coalesce(a.ActivationDate,r.RecordDate), f.FailedDate) <= 10 then 1 else 0 end),
Bounce = sum(case when datediff(day, coalesce(a.ActivationDate,r.RecordDate), f.FailedDate) between 11 and 180 then 1 else 0 end)
from
Despatch d
left join
Activation a
on d.SerialNo= a.SerialNo
and d.DispatchDate <= a.ActivationDate
and d.LOTQty = a.LOTQty
left join
Replaced r
on d.SerialNo= r.NewSerialNo
and d.DispatchDate <= r.RecordDate
and (a.ActivationDate is null or a.ActivationDate < d.DispatchDate)
left join
Failed f
on (f.FailedSINo = a.SerialNo)
or (f.FailedSINo = r.NewSerialNo)
where
d.LOTQty = 15
group by
d.LOTQty, d.DispatchDate
带有测试数据的