IT分销/经销

谁能解释下这个问题是怎么回事

SQL1
with source
as 
(
        select
                option as OptionOrAPEXMTM,
                REV,
                VOL,
                rank() over(order by REV desc) as rk
        from 
                P2P.SYSX_REPORT3 
        where 
                status='Active' and REV is not null
        order by rev desc
)

        select 
                s.rk,
                s.OptionOrAPEXMTM,
                s.REV,
                s.VOL,
                ( select sum(rev) from source as sc where sc.rk <= s.rk) as Increase,
                (select sum(rev) from source) as total,
                (( select sum(rev) from source as sc where sc.rk <= s.rk)/(select sum(rev) from source)) as percent --这里
        from
                source as s


pic1.jpg


SQL2:
with source
as 
(
        select
                option as OptionOrAPEXMTM,
                REV,
                VOL,
                rank() over(order by REV desc) as rk
        from 
                P2P.SYSX_REPORT3 
        where 
                status='Active' and REV is not null
        order by rev desc
)

        select 
                s.rk,
                s.OptionOrAPEXMTM,
                s.REV,
                s.VOL,
                ( select sum(rev) from source as sc where sc.rk <= s.rk) as Increase,
                (select sum(rev) from source) as total,
                (( select sum(rev) from source as sc where sc.rk <= s.rk)*1.0000/(select sum(rev) from source)) as percent --这里,*1.0000
        from
                source as s




我用SQL1去一个view的结果,逻辑跟这个一模一样,跑出来的percent是正常的小树,但是SQL1去跑这个view的时候就是0和1了(我猜的是被强制转化成int了). 请教各位,为什么会成这个样子啊?
参与3

2同行回答

zzrismezzrismeit技术咨询顾问IBM
除法精度问题,设一下MIN_DEC_DIV_3可以解决,默认情况下商的精度是除数和被除数计算出来的,信息中心有一个公式的。显示全部
除法精度问题,设一下MIN_DEC_DIV_3可以解决,默认情况下商的精度是除数和被除数计算出来的,信息中心有一个公式的。收起
IT咨询服务 · 2012-11-03
浏览670
leiyutianleiyutian数据库架构师chengdu
这个问题确实是让人有些费解的。 看下面的例子:create table t(c1 decimal(18,4), c2 decimal(18,4))DB20000I  The SQL command completed successfully.insert into t values(9.99, 7.25),(19.99, 15.99),(49.99, 39.99)DB20000I  The SQL command ...显示全部
这个问题确实是让人有些费解的。 看下面的例子:

create table t(c1 decimal(18,4), c2 decimal(18,4))
DB20000I  The SQL command completed successfully.

insert into t values(9.99, 7.25),(19.99, 15.99),(49.99, 39.99)
DB20000I  The SQL command completed successfully.

select sum(c1), sum(c2), sum(c1) / sum(c2) from t
1                                 2                                 3
--------------------------------- --------------------------------- ---------------------------------
                          79.9700                           63.2300                                1.
  1 record(s) selected.

select sum(c1), sum(c2), cast(sum(c1) as decimal(18,4)) / cast(sum(c2) as decimal(18,4)) from t

1                                 2                                 3
--------------------------------- --------------------------------- ---------------------------------
                          79.9700                           63.2300                   1.2647477463229

  1 record(s) selected.

我也不大习惯这个用法的其实。
另外的解决办法是在创建DB之前,把 Number compatibility 开关打开。
Number compatibility                                    = OFF收起
互联网服务 · 2012-11-01
浏览620

提问者

StupidAlex
数据库管理员IBM

问题状态

  • 发布时间:2012-11-01
  • 关注会员:1 人
  • 问题浏览:2229
  • 最近回答:2012-11-03
  • X社区推广