首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >引用多个表从multiple 2008中提取数据

引用多个表从multiple 2008中提取数据
EN

Stack Overflow用户
提问于 2015-03-13 09:47:38
回答 1查看 88关注 0票数 1

我已经问了一个类似的问题,这里,并得到了jpw的帮助,后者帮助我进行了查询。这里的情况保持不变,但只增加了一些细节。我有四张桌子。其中三个国家的样本结构如下:

我得到了帮助,形成了如下查询:

代码语言:javascript
复制
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表的SerialNoActivation表匹配。如果匹配,则检查日期差异。如果DespatchDate < ActivationDate只考虑这些数字,而其他数字(不匹配的或DispatchDate > ActivationDate不匹配的)被替换为类似的日期标准。最后,我们发现9个匹配,即来自Activation的7个匹配和来自Replaced的2个匹配,如下所示:

代码语言:javascript
复制
LotQty | ApprovedQty | DispatchDate | Installed
  15   |      10     |   2013-8-7   |    9

我想在这里再显示两个列,即DOABounce,如下所示:

代码语言:javascript
复制
LotQty | ApprovedQty | DispatchDate | Installed | DOA | Bounce
  15   |      10     |   2013-8-7   |    9      |  2  |   4

Failed表的FailedDate和上述9个匹配序列的激活/记录日期(以下简称act_rec_date)之间的差异应计算DOA和反射值。Failed表和中间9匹配的SerialNo结构如下所示:

Intermediate表实际上不存在。这只是供参考和提供更多的清晰度。Intermediate表包含与ActivationReplaced表匹配的SerialNoact_rec_Date字段相应地匹配激活/记录日期。

  1. Failed表与DOA &弹跳=我们应该匹配所有9个结果序列编号(即中间表)。如果匹配,计算FailedDateact_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 = 2Bounce = 4

我想要建立一个查询,可以给我的DOA和弹跳以及。我尝试创建一个临时表并将结果SerialNo's和act_rec_Date转储到其中。接下来,我尝试匹配temp表和失败表。我无法让它正常工作,而且,执行查询也需要大约7分钟的时间。

P.S-我的实际表包含大约50到100 k的数据条目。

EN

回答 1

Stack Overflow用户

发布于 2015-03-13 16:44:42

继续上一次查询,我认为可以在select语句中添加一个条件聚合,并为失败的表添加另一个左联接。

这应该是可行的,但我确信查询可以改进:

代码语言:javascript
复制
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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29029135

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档