使用连接和select语句计算SQL

时间:2014-01-29 16:21:43

标签: sql sql-server sql-server-2008 join

我确实要求提出这个问题的一部分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_PIECESSALES_SUM_PIECES总结table2table3。例如:对于来自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语句来完成。 有任何建议请帮忙!

由于

2 个答案:

答案 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中它运行得足够快。