#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 решает проблему.