根据同一个表中的行插入表中

时间:2014-06-25 15:04:38

标签: sql join sybase sql-insert self-join

我有一个表格,如下所示,它将包含多行数据 - 最多几行。

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 / 0,但是当我执行上述操作时,如果(report_cycle / report_cycle)*100中只有一个被取消注释,它(部分)可以工作 - 这些行中有2个或更多返回零结果。

另外,如果我只有一个(report_cycle / report_cycle)*100未注释,则返回60个结果,其中有106个“总共”记录和106个“3-Bal”记录 - 我本来希望proc能够运行并返回106'4%'的结果。

我不确定我错过了什么。

1 个答案:

答案 0 :(得分:0)

好吧,我有错误的原因。如果我执行:

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声明解决了这个问题。