2017-04-20 14 views
0

我不得不使用一點怪物查詢來計算用於製造某些小部件的工具數量。由於許多工具可以用於多個小工具,並且大量工具在後臺完成,以將小工具與工具關聯起來,涉及包含數千行的表格,所以整個工作有點慢。我現在遇到的問題是爲了讓小部件和工具的數量正確,我不得不將它們按照它們重複的次數分開 - 爲此,我必須對已經很慢的查詢進行求和運行,這使得事情成倍地變慢。有沒有更聰明的方式去做我正在做的事情?我正在使用SQL Express進行開發,因此我無法訪問查詢分析器等,這對我們有很大的幫助。在同一張表上優化一個SQL總和

所以這裏是我在做什麼的簡化版本 - 因爲我認爲總和的主要罪犯

所以這是我的查詢的數據我不會進入瘋狂的瘋狂加入,只是還沒有 - 是的,它看起來很亂,但這是最終應用程序需要的(超出我的控制範圍,否則它會是參數化視圖)。它只是在T_QTY列上做了一個平坦的總和。我們實際上擁有的是一套工具交易13和6,總共提供了19種工具,但是它們在所有這些窗口小部件系列中都被重複使用。就像明智的一樣,只有5個車輪被製造出來,但是它被列爲兩次,因爲使用了兩個工具所以當它做到這一點時,它會得到一個香蕉形象。

Select [Tool Date], [T_ID], [T_Trns], [T_QTY], [Widget Date], [W_Family], [W_QTY] from my_Widget_view 
 
[Tool Date] [T_ID] [T_Trns] [T_QTY] [Widget Date] [W_Family] [W_QTY] 
01/01/17  T11  11  13  01/02/17  Wheels  5 
01/01/17  T11  12  6  01/02/17  Wheels  5 
01/01/17  T11  11  13  01/02/17  Keyboards 7 
01/01/17  T11  12  6  01/02/17  Keyboards 7 
01/01/17  T11  11  13  01/02/17  Mice   3 
01/01/17  T11  12  6  01/02/17  Mice   3 
           --- 
          sum = 57 (wrong !) 

如果我想總結我的QTY列正確的,我需要知道使用該工具,交易和家庭的數量和分下降到正確的 - 所以我必須做一個怪物子查詢像這樣。

Select 

[T_ID], 
(select sum([T_Trns]) from my_Widget_view as A where A.[T_ID] = B.[T_ID] and A.[Tool Date] = b.[Tool Date]) as Trns_cnt 

[T_QTY], 
    [T_QTY]/(select sum([W_Family]) from my_Widget_view as A where A.[T_ID] = B.[T_ID] and A.[Tool Date] = b.[Tool Date]) /(select sum([T_Trns]) from my_Widget_view as A where A.[T_ID] = B.[T_ID] and A.[Tool Date] = b.[Tool Date]) as divcnt 

[W_Family], 
(select sum([W_Family]) from my_Widget_view as A where A.[T_ID] = B.[T_ID] and A.[Tool Date] = b.[Tool Date]) as Fmly_cnt 
[W_QTY] 
from my_Widget_view as B 

這使(留出從上面的某些行的可讀性

 
[Tool Date] [T_Trns] [Trns_cnt] [T_QTY] [divcnt] [W_Family] [W_QTY] [Fmly_cnt] 
01/01/17  11   2  13  4.33 Wheels  5  6 
01/01/17  12   2  6  2  Wheels  5  6 
01/01/17  11   2  13  4.33 Keyboards 7  6 
01/01/17  12   2  6  2  Keyboards 7  6 
01/01/17  11   2  13  4.33 Mice   3  6 
01/01/17  12   2  6  2  Mice   3  6 
              --- 
             sum = 19 (right !) 

我希望這一切是有道理的,我不是一個真正的全職SQL開發人員,所以道歉的任何錯誤或耀眼錯誤

+0

我認爲這個問題肯定會受益於* input *數據(我假設它來自多個表格)的清晰表示,並刪除了不相關的列。我假設你現在向我們展示的是輸出和輸出。 –

+0

對不起,這是兩個輸出查詢。我不想進入原始投入部分,因爲它至少會使問題的規模擴大一倍,雖然它有自己的問題,但我認爲我的大部分問題都是通過在同一張桌子上一次又一次地總結出來的。源數據基本上是3k行工具數據,27k行小部件數據,然後是將工具關聯到族(13k行)的表,然後是將該族與小部件(3k行)相關聯的另一個表。 –

+0

但是,*修復*的邏輯地點是爲了避免受到約束不足的連接,這會導致您的總計乘以不相關的實體。 –

回答

0

由於@Damien_The_Unbeliever建議,我認爲你的問題可能通過重新實現my_Widget_View得到更好的解決,但如果你真的不能,你可以嘗試使用幾個子查詢來對它們進行整形:

select Tool_Date, 
     T_ID, 
     sum(T_QTY), 
     sum(W_QTY) 
from (select distinct 
       Tool_Date, 
       T_ID, 
       T_TRNS, 
       T_QTY 
     from my_Widget_View) dt 
     join 
     (select distinct 
       Tool_Date, 
       T_ID, 
       W_QTY 
     from my_Widget_View) df 
     on dt.T_ID = df.T_ID and dt.Tool_Date = df.ToolDate