Вставка в таблицу на основе строк в той же таблице

#sql #join #sybase #sql-insert #self-join

#sql #Присоединиться #sybase #sql-вставка #самосоединение

Вопрос:

У меня есть таблица, как показано ниже, которая будет содержать несколько строк данных — максимум пару тысяч строк.

 lvl2  | lvl3 | lvl6 | this_rep_cycle   | last_rep_cycle | prev_rep_cycle | rowType
================================================================================
ASSET | CURR | FI   | 214,060,924,928  | 0              | 0              | 1-Total
ASSET | CURR | FI   | 25,199,630,336   | 0              | 0              | 3-Bal
ASSET | CURR | FX   | 123,941,472      | 0              | 0              | 1-Total
ASSET | CURR | FX   | 0                | 0              | 0              | 3-Bal
 

Что мне нужно, так это вставить новую строку в таблицу с тем же lv12, vl3, lvl6, но где:

 this_rep_cycle = (this_rep_cycle for rowType = '3-Bal' / this_rep_cycle for rowType = '1-total)
last_rep_cycle = (last_rep_cycle for rowType = '3-Bal' / last_rep_cycle for rowType = '1-total)
prev_rep_cycle = (prev_rep_cycle for rowType = '3-Bal' / prev_rep_cycle for rowType = '1-total)
 

Конечный результат должен выглядеть так:

 lvl2  | lvl3 | lvl6 | this_rep_cycle   | last_rep_cycle | prev_rep_cycle | rowType
================================================================================
ASSET | CURR | FI   | 214,060,924,928  | 0              | 0              | 1-Total
ASSET | CURR | FI   | 25,199,630,336   | 0              | 0              | 3-Bal
ASSET | CURR | FI   | 11.77            | 0              | 0              | 4-%
ASSET | CURR | FX   | 123,941,472      | 0              | 0              | 1-Total
ASSET | CURR | FX   | 0                | 0              | 0              | 3-Bal
ASSET | CURR | FX   | 0                | 0              | 0              | 4-%
 

Для достижения этой цели я написал самосоединение:

 set arithignore on
select  
pd_1.lvl2, pd_1.lvl3, pd_1.lvl4, pd_1.lvl6, pd_2.last_report_cycle as p2_lrp, pd_1.last_report_cycle  as p1_lrp,
    (pd_2.this_report_cycle / pd_1.this_report_cycle)*100 as this_report_cycle,
    (pd_2.last_report_cycle / pd_1.last_report_cycle)*100 as last_report_cycle 
--  (pd_2.prev_report_cycle / pd_1.prev_report_cycle)*100 as prev_report_cycle,     
--  '4-%' as [percentage]
from ProxyTrending pd_1
    inner join ProxyTrending pd_2 on pd_2.rowType = '3-Bal'
        AND pd_1.lvl2 = pd_2.lvl2
        AND pd_1.lvl3 = pd_2.lvl3
        AND pd_1.lvl4 = pd_2.lvl4
        AND pd_1.lvl6 = pd_2.lvl6
where pd_1.rowType = '1-Total'
    --order by pd_1.lvl2, pd_1.lvl3, pd_1.lvl4, pd_1.lvl6
set arithignore off
 

Мне нужно set arithignore , поскольку я могу использовать div / zero, но когда я выполняю описанное выше, оно (частично) работает, если только одна из (report_cycle / report_cycle)*100 них не раскомментирована — возвращаются 2 или более из этих строк и нулевые результаты.

кроме того, если у меня есть только один из (report_cycle / report_cycle)*100 раскомментированных, возвращается 60 результатов, где есть 106 записей «1-total» и 106 записей «3-Bal» — я бы ожидал, что процедура запустится и вернет 106 результатов «4%».

Я не уверен, чего мне не хватает.

Ответ №1:

Ну, у меня есть причина ошибки. Если я выполняю:

 select pd_2.this_report_cycle, pd_1.this_report_cycle...
 

инструкция выполняется и возвращает значения. Если я размещаю:

 select pd_2.this_report_cycle, pd_1.this_report_cycle,  
       (pd_2.this_report_cycle / pd_1.this_report_cycle)*100 as expected_result
 

запрос возвращает нулевые строки, если любое из значений равно 0, несмотря на настройку ARITHIGNORE .

И оператор CASE решает проблему.