我确实要求提出这个问题的一部分here只是为了从我被卡住的地方开始。但是,现在我遇到很多问题需要进一步找到解决方案。好吧,我应该说我已经结束了自己的状态,我可以编写一个纯逻辑的复杂查询。但是,现在我在这种情况下,我知道逻辑,但无法通过写作实现。这是我的问题的描述:
问题:
表1:
REFID ARTIKEL SUPPLIERID ORGID PIECES COSTPRICE DISCOUNT
126663 TV SONY 922 6 110 2.5
126663 TV Toshiba 922 4 75 2
126663 TV SONY 922 10 80 1
126663 TV LG 922 10 80 1
126663 TV SONY 922 4 65 1.5
126663 TV SONY 922 14 95 1.5
表2:
REFID ARTIKEL SUPPLIERID ORGID STOCK_SUM_PIECES
126663 TV SONY 922 16
126663 TV Toshiba 922 20
表3:
REFID ARTIKEL SUPPLIERID ORGID STORE SALE_SUM_PIECES DATE
126663 TV SONY 922 100 4 01.01.2014
126663 TV Toshiba 922 100 3 01.01.2014
执行的操作:
首先,我需要分别从STOCK_SUM_PIECES
和SALES_SUM_PIECES
总结table2
和table3
。例如:对于来自TABLE2的SONY,SUM_RESULT为16 + 4 = 20表3
接下来,将SUM_RESULT
分发到table1
中的行,如图所示here。在分发过程中,一旦值达到零,它就意味着只有那些行对TABLE2中的“SUM_PIECES”有效。例如:对于SONY,SUM_RESULT 20
仅对TABLE1
中的三行有效,因为总数达到20,即6 + 10 + 4 = 20。现在只选择这三行并计算TABLE1中的成本价格和折扣的平均值。
这是我无法解决的最复杂的部分。我不是要求一个人写一个查询而是给我一个想法或方法来结束解决方案。
我目前成功进行了适当的连接,但在连接期间无法执行计算。这对我来说很复杂,因为我不能使用curosrs或for循环等等,因为我必须使它具有高效性,而且数据也可能是数十亿行。所以必须使用连接和select语句来完成。 有任何建议请帮忙!
由于
答案 0 :(得分:1)
好吧,对于第一部分,我会使用UNION
两个查询来获取SUM_RESULT
,每个表一个。按照此操作的键对这些结果进行分组(它是ARTIKEL和SUPPLIERID的组合,对吧?)。然后,您可以将这些结果连接到第一个表,并使用Gordon Linoff的答案中的累积和技术,选择累积和小于或等于SUM_RESULT的行,在此结果集上,您可以进行平均。
答案 1 :(得分:1)
好的,第一部分很简单,使用UNION ALL并仅在最快运行所需的字段上创建SUM。第二部分是一个问题。你需要一个窗口功能。
第一部分可能如下:
SELECT SUPPLIERID, SUM(TO_SUM) SUM_PIECES FROM (
SELECT STOCK_SUM_PIECES AS TO_SUM, SUPPLIERID
FROM TABLE2
UNION ALL
SELECT SALE_SUM_PIECES AS TO_SUM, SUPPLIERID
FROM TABLE3
) GROUP CONDITION ...
这将是你的桌子X。
如果要将此总和分配到表1中,则依赖于表1的排序。我认为您的表是按照您的需要排序的,您需要将此数字拆分为订单中的行。
所以,现在你需要一个Windows功能。从开始到实际行的每一行得到总和。看看这个:
SELECT ALL_WHAT_YOU_NEED_TO_RETURN
, SUPPLIERID
, SUM(PIECES)
OVER (ORDER BY YOUR_ORDER
ROWS BETWEEN preceding AND current row) AS SUM_FROM_BEGIN
FROM TABLE1
ORDER BY YOUR_ORDER_CONDITION
这将是你的桌子Y.
好的,现在我们可以将它放在一起,只从表Y返回这些行,从开始到实际行的总和低于或者与表X中的片数相同:
SELECT ALL_WHAT_YOU_NEED_TO_RETURN
FROM (SELECT Y.ALL_WHAT_YOU_NEED_TO_RETURN
, Y.SUPPLIERID
, SUM(Y.PIECES)
OVER (ORDER BY Y.YOUR_ORDER
PARTITION BY Y.SUPPLIERID
ROWS BETWEEN PRECEDING AND CURRENT ROW) AS SUM_FROM_BEGIN
, X.SUM_PIECES
FROM TABLE1 Y
, (SELECT SUPPLIERID, SUM(TO_SUM) SUM_PIECES
FROM (SELECT STOCK_SUM_PIECES AS TO_SUM, SUPPLIERID
FROM TABLE2
UNION ALL
SELECT SALE_SUM_PIECES AS TO_SUM, SUPPLIERID
FROM TABLE3
)
GROUP BY SUPPLIERID
) X
WHERE Y.SUPPLIERID = X.SUPPLIERID
) WHERE SUM_FROM_BEGIN <= SUM_PIECES
最重要的是最后一个条件和窗口功能 我不知道它在sql server中是否有用,但在Oracle中它运行得足够快。