2014-01-29 67 views
0

我确实要求这个问题的一部分here只是为了让我自己从被卡住的地方开始。但是,现在我遇到很多问题需要进一步寻找解决方案。那么,我应该说我已经结束了自己的状态,在那里我可以编写一个纯粹逻辑的复杂查询。但是,现在我在这种情况下,我意识到了逻辑,但不能通过写作来实现。这里是我的问题的描述:使用连接和select语句进行计算SQL

问题:

表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 

要执行的操作:

首先我需要从table2table3 respectively.For例子总结STOCK_SUM_PIECESSALES_SUM_PIECES:SUM_RESULT为16 + 4 = 20,用于从SONY和TABLE2表3 接着,如图分发SUM_RESULT到行中table1here。在分发过程中,一旦值达到零,就意味着只有那些行对TABLE2中的“SUM_PIECES”有效。例如:SONY的SUM_RESULT 20仅适用于TABLE1中的三行,因为件数总计为20,即6 + 10 + 4 = 20。现在只选择这三行并计算TABLE1中的成本价格和折扣的平均值。

这是我无法解决的最复杂的部分。我不是要求一个人写一个查询,而是给我一个想法或方法来结束解决方案。

我目前成功地进行适当的连接,但在连接期间无法执行计算。这对我来说很复杂,因为我不能使用curosrs或for循环等,因为我必须使其性能高效,并且数据量也可能超过十亿行。所以它必须使用连接和选择语句来完成。 任何建议请帮忙!

感谢

+0

假设mysql标记是错误的。我会建议试着让你的问题自成一体,展示你尝试过的东西,想要什么。你可以用你试过的东西得到你想要的东西。 –

+0

我写的井问很大,字段名称与示例中显示的不一样。这就是为什么我试图创建一个可以简单的方式定义我的问题的小例子 –

+0

示例数据没问题,但是查询和期望的输出在哪里?把这些问题都放在这个问题上,你会得到比现在更好的回应,即时通讯。 –

回答

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.
OK,现在我们可以把它一起返回仅从数据表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中它的工作速度足够快。

+0

非常感谢你。我正在尝试实施您的解决方案。我会让你知道结果。对此,我真的非常感激。 –

+0

Ups,我忘了一个重要的事情,我记得当我关闭计算机在工作:) ..在你的窗口函数中,你必须使用PARTITION子句..像这样:SUM(COL_X)OVER(PARTITION BY SUPPL ORDER BY XYZ )..但正如我在这里看到的:http://technet.microsoft.com/en-us/library/ms189461(v=sql.105).aspx RANGE子句只能在SQL Server 2012后支持:(..请检查 – Atiris

+0

非常感谢您的回复。 –

1

嗯,第一部分我会得到你的SUM_RESULT通过使用两个UNION一个疑问,一个在每个表。将这些结果按照您的键进行分组(这是ARTIKEL和SUPPLIERID的组合,对吗?)。然后,您可以将这些结果加入第一个表格,并使用Gordon Linoff的答案中的累计和技术来选择累积和小于或等于SUM_RESULT的行,并在此结果集上进行平均。

+0

感谢您的建议。这有助于很多! –