在同一个表上优化SQL Sum

时间:2017-04-20 09:45:07

标签: sql sql-server tsql sum aggregate-functions

我不得不做一些使用的怪物查询,用于计算用于制作某些小部件的工具数量。因为可以在许多小部件中使用许多工具,并且在后台完成了大量工作以将小部件与工具相关联,涉及具有数千行的表,因此整个过程有点慢。我现在遇到的问题是为了正确计算小部件和工具的数量,我不得不将它们重新划分为重复的数量 - 为此,我必须对已经很慢的查询进行求和。运行,这会使事情呈指数级增长。有没有更明智的方式来做我正在做的事情?我正在使用SQL Express进行开发,因此我无法访问查询分析器,这将有很大帮助。

所以这是我正在做的简化版本 - 我不会进入疯狂的疯狂联盟,因为我认为总和是主要罪犯

所以这是我的查询中的数据 - 是的它看起来很乱,但这是最终应用程序所需要的(超出我的控制范围,否则它将是参数化视图)。它只是在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开发人员,因此对任何错误或明显的错误表示歉意。

1 个答案:

答案 0 :(得分:0)

正如@Damien_The_Unbeliever建议的那样,我认为通过重新实现my_Widget_View可以更好地解决您的问题,但如果您真的无法解决问题,您可以尝试使用几个子查询来对数据进行整形: / p>

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