2014-01-29 64 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

感謝您的建議。這有助於很多! –