2016-03-23 14 views
0

私はTABLE_ATABLE_Bを持っていますので、TABLE_B_FINALを作成する必要があります。

ルール:
TABLE_AID_C=1AB=AFTERの値の値は、我々はTABLE_B(行ID_C=1及び列AFTER)に対応する値とWEIGHTの値を乗算する場合は。

次に例:
TABLE_AID_C=1AB=BEFOREとの値の値は、我々はTABLE_B(行ID_C=1及び列BEFORE)に対応する値とWEIGHTの値を乗算する場合は。
TABLE_Aの値がID_C=2で、値がAB=AFTERの場合、WEIGHTの値にTABLE_B(行ID_C=2および列AFTER)の対応する値を掛けます。

このアルゴリズムは、すべてのレコードをTABLE_Aにチェックし、その値にWEIGHTと、対応する値をTABLE_Bで倍数にします。

最初にTABLE_Bには、すべての行と列にデフォルト値1AFTERBEFORE)があります。この値は乗算の間に変化します。SQLのテーブル分析

TABLE_A

 
ID_N|WEIGHT_N|ID_C |AB  | 
5 |1.15 | 1 |AFTER  | 
12 |1.13 | 1 |BEFORE | 
60 |1.65 | 3 |AFTER  | 
90 |1.85 | 2 |AFTER  | 
80 |1.45 | 3 |AFTER  | 
140 |1.57 | 2 |BEFORE | 

TABLE_B

 
|ID_C |BEFORE|AFTER| 
|1 |1  | 1 | 
|2 |1  | 1 | 
|3 |1  | 1 | 

TABLE_B_FINAL

 
|ID_C |BEFORE  |AFTER   | 
|1 |1*1.13=1.13 | 1*1.15=1.15  | 
|2 |1,57  | 1,85   | 
|3 |1   | 1*1.65*1.45=2.39| 
+2

これまで行ってきたことをSQLスクリプトとテーブルスキーマで見せてください。 – stjepano

+0

私の考えは、最初のサイクルをTABLE_Aから実行し、ID_C = 1,2,3、... nと最初のサイクルの内側にある2番目のサイクルを検索し、その値がAFTERかBEFOREかを認識することです。しかし、私はそれをする方法を知らないです。 – hanznv

+0

サイクルやループする必要はありません。 table_a.abの値に基づいて正しい値を取得するだけです。そして、製品を計算するために再帰的なクエリが必要になるかもしれません:http://stackoverflow.com/a/36201120/2235885 – joop

答えて

1
Select TABLE_B.ID_C AS ID_C, BEFORE = 
    CASE TABLE_C.AB 
    WHEN 'BEFORE' THEN TABLE_B.BEFORE*TABLE_C.WEIGHT_N 
    ELSE TABLE_B.BEFORE 
    END, 
AFTER = 
    CASE TABLE_C.AB 
    WHEN 'AFTER' THEN TABLE_B.AFTER*TABLE_C.WEIGHT_N 
    ELSE TABLE_B.AFTER 
    END 
FROM (SELECT ID_C, AB, EXP(SUM(ln(WEIGHT_N))) FROM TABLE_A GROUP BY ID_C, AB) as TABLE_C 
JOIN TABLE_B ON TABLE_B.ID_C=TABLE_C.ID_C; 
+0

助けてくれてありがとう:-) – hanznv

関連する問題