从MS SQL Server-2008中提取数据,引用多个表

时间:2015-03-13 09:47:38

标签: sql-server sql-server-2008

我已经问了一个类似的问题here并得到jpw帮助我查询的帮助。这里的情况仍然相同,但只增加了一些细节。我有四张桌子。其中三个的样本结构如下: enter image description here

我已经帮助形成查询,如下所示:

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结构如下所示:

enter image description here

Intermediate 表格实际上并不存在。它仅供参考,并提供更清晰的信息。 Intermediate 表包含与 SerialNo Activation 匹配的Replaced表。 act_rec_Date字段相应地匹配激活/记录日期。

  1. DOA&amp;弹跳 =我们应该将所有9个生成的SerialNo(即中间表)与 Failed 表匹配。如果匹配,请计算FailedDateact_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
  2. 我想构建一个可以给我DOA和Bounce的查询。我尝试创建一个临时表,并将生成的SerialNo&#39; s和act_rec_Date转储到其中。接下来我尝试匹配临时表和失败表。我无法让它工作,甚至还需要大约7分钟来执行查询。

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

1 个答案:

答案 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
带有测试数据的

Sample SQL Fiddle