2016-03-23 3 views
0

У меня есть TABLE_A и TABLE_B, и мне нужно создать TABLE_B_FINAL.

Правило:
Если в TABLE_A значение ID_C=1 и значение AB=AFTER мы будем умножить значение WEIGHT с соответствующим значением в TABLE_B (строки и столбца ID_C=1AFTER).

Следующая примеры:
Если в TABLE_A значение ID_C=1 и значение AB=BEFORE мы будем умножить значение WEIGHT с соответствующим значением в TABLE_B (строки и столбца ID_C=1BEFORE).
Если в TABLE_A значение ID_C=2 и значение AB=AFTER мы будем умножить значение WEIGHT с соответствующим значением в TABLE_B (строки и столбца ID_C=2AFTER).

Этот алгоритм проверяет все записи в TABLE_A и умножает их значение WEIGHT с соответствующим значением в TABLE_B.

В начале TABLE_B имеет значение по умолчанию 1 во всех строках и столбцах (AFTER и BEFORE). Это значение изменится во время умножения.Таблица анализа в 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 и второй цикл, который будет находиться в первом цикле и распознает, будет ли значение ПОСЛЕ или ПЕРЕД. Но я не знаю, как это сделать. – 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

Смежные вопросы