2015-03-13 109 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