我已经问了一个类似的问题,这里,并得到了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 | 4Failed表的FailedDate和上述9个匹配序列的激活/记录日期(以下简称act_rec_date)之间的差异应计算DOA和反射值。Failed表和中间9匹配的SerialNo结构如下所示:

Intermediate表实际上不存在。这只是供参考和提供更多的清晰度。Intermediate表包含与Activation和Replaced表匹配的SerialNo。act_rec_Date字段相应地匹配激活/记录日期。
Failed表与DOA &弹跳=我们应该匹配所有9个结果序列编号(即中间表)。如果匹配,计算FailedDate和act_rec_date之间的差异。如果差异是(0 to <=10 days),那么在DOA下计数它,如果D差是(>10 days to <=180 days),则在Bounce下计数它。从Failed中我们发现6个匹配项,其中Product1,2 1,2属于DOA,因为act_rec_Date之间的差值为0,而Product1,2 7、8、9和10属于Bounce,因为它们的差异是89 | 54 | 61 | 61。因此,如上面所示,DOA = 2和Bounce = 4我想要建立一个查询,可以给我的DOA和弹跳以及。我尝试创建一个临时表并将结果SerialNo's和act_rec_Date转储到其中。接下来,我尝试匹配temp表和失败表。我无法让它正常工作,而且,执行查询也需要大约7分钟的时间。
P.S-我的实际表包含大约50到100 k的数据条目。
发布于 2015-03-13 16:44:42
继续上一次查询,我认为可以在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带有测试数据的示例SQL Fiddle
https://stackoverflow.com/questions/29029135
复制相似问题