我不得不做一些使用的怪物查询,用于计算用于制作某些小部件的工具数量。因为可以在许多小部件中使用许多工具,并且在后台完成了大量工作以将小部件与工具相关联,涉及具有数千行的表,因此整个过程有点慢。我现在遇到的问题是为了正确计算小部件和工具的数量,我不得不将它们重新划分为重复的数量 - 为此,我必须对已经很慢的查询进行求和。运行,这会使事情呈指数级增长。有没有更明智的方式来做我正在做的事情?我正在使用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开发人员,因此对任何错误或明显的错误表示歉意。
答案 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