2015-03-13 69 views
1

我已经问了一个类似的问题here,并得到jpw谁帮我查询。这里的情况保持不变,但只增加了一点细节。我有四张桌子。以下为他们三人的样本结构给出: enter image description here从多个表中提取MS SQL Server-2008的数据

我一直在帮助形成查询其下面有云:

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场比赛,即7从Activation和2从Replaced如下:

LotQty | ApprovedQty | DispatchDate | Installed 
    15 |  10  | 2013-8-7 | 9 

我想在这里也就是DOABounce这样显示两列:

LotQty | ApprovedQty | DispatchDate | Installed | DOA | Bounce 
    15 |  10  | 2013-8-7 | 9  | 2 | 4 

DOA和跳动应计算与第4个表之间的差异即Failed表的FailedDate和上面9个匹配的SerialNo的相应激活/记录日期(以下称为act_rec_date)。 Failed表和中间体9匹配下面的SerialNo的结构如下所示:

enter image description here

Intermediate物理上不存在。它仅供参考,并提供更多清晰。 Intermediate表包含那些SerialNo,这与ActivationReplaced表匹配。 act_rec_Date字段相应匹配激活/记录日期。

  1. DOA &反弹 =我们应该Failed表匹配所有9产生的SerialNo的(即中间表)。如果匹配,则计算FailedDateact_rec_date之间的差异。如果差值为(0 to <=10 days)则计算它在DOA之下,如果差值为(>10 days to <=180 days)则根据Bounce对其进行计数。从Failed我们找到6个匹配结果,产品1,2落入DOA,因为act_rec_Date为0和Product7,8,9之间的差异& 10属于Bounce,因为它们的区别是89 | 54 | 61 | 61。因此,上述DOA = 2Bounce = 4

如图所示我想建立一个查询这可能给我DOA和弹跳以及。我尝试创建一个临时表并将结果SerialNo和act_rec_Date转储到它中。接下来我尝试匹配临时表和失败表。我无法工作,甚至花了大约7分钟甚至执行查询。

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

回答

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测试数据

+0

@ JPW查询工作的罚款为样本数据。但是当我试着用一个更大的样本对每个表格中的60-80数据进行测试时,结果是不同的。我尝试了粘贴SQL小提琴中使用的表格脚本,但它被吹掉了。所以我在[Pastebin](http://pastebin.com/3wf4Y7Sm)中从SQL-Server 2008粘贴了我的表格脚本。你能看看吗? “LotQty”,“ApprovedQty”,“DispatchDate”,“Installed”,“DOA”和“Bounce”的预期答案是**。 47 | 2013-10-3 | 40 | 7 | 8 **,但我得到**'47 | 49 | 2013-10-3 | 40 | 7 | 7' **,对于我的真实表格,差异更大 – 2015-03-14 07:29:48

+0

@KC我已经看过它,并且我无法得到相同的结果,但是我得到了 '47 | 47 | 2013-10-31 | 40 | 7 | 7'。它显示49安装的原因是因为替换表中有两个产品有两个日期。我看不出弹跳可以达到8次。 – jpw 2015-03-14 14:52:08

+0

@ jpw但是'ApprovedQty'应该完全基于**'Despatch' **表格显示。 **'Despatch' **表只包含47个数据条目,并且它应该从Despatch获得批次47 **的**计数(SerailNo)。一般来说,它可以等于LotQty或更少,但从不更多。我会手动检查数据n让你知道'Bounce'我说错了。谢谢 – 2015-03-14 15:26:21