2017-04-20 44 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 
相关问题