首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Oracle除数等于零

Oracle除数等于零
EN

Stack Overflow用户
提问于 2013-04-04 05:56:01
回答 3查看 3.2K关注 0票数 0

我如何在不计算两次分母求和的情况下,围绕这个查询包装一个解码器来处理零因子?我不想返回thedate和四舍五入百分比以外的任何内容。

代码语言:javascript
复制
SELECT thedate, ROUND (100*
  SUM( case when TRUNC(ACTIVITY_END_DATE) <= thedate
     AND TRUNC(ACTIVITY_END_DATE) >= add_months( trunc(thedate,'mm'), -12) 
     AND trunc(ACTIVITY_END_DATE) <= trunc(ACTIVITY_NEED_DATE) 
     AND SYSDATE  >=  trunc(thedate,'mm') then 1 else 0 end )  
  /
  SUM( case when TRUNC(ACTIVITY_END_DATE) <= thedate 
     AND TRUNC(ACTIVITY_END_DATE) >= add_months( trunc(thedate,'mm'), -12) 
     AND SYSDATE  >=  trunc(thedate,'mm') then 1 else 0 end ) ) as OTR12 
       FROM TEST
       cross join (  select add_months(last_day(SYSDATE), level-7) as thedate 
       from dual connect by level <= 12  )  
       GROUP BY thedate 
       ORDER BY thedate 

看起来在解码的时候,我必须做两次分母求和

DECODE(denominator_summation,0,NULL, numerator_summation / denominator_summation)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-04 05:58:43

使用子查询怎么样?

代码语言:javascript
复制
select thedate, (case when denom <> 0 then round(100*num/denom) end)
from (SELECT thedate,
             SUM( case when TRUNC(ACTIVITY_END_DATE) <= thedate
                            AND TRUNC(ACTIVITY_END_DATE) >= add_months( trunc(thedate,'mm'), -12) 
                            AND trunc(ACTIVITY_END_DATE) <= trunc(ACTIVITY_NEED_DATE) 
                            AND SYSDATE  >=  trunc(thedate,'mm') then 1 else 0
                  end )   as num,
             SUM( case when TRUNC(ACTIVITY_END_DATE) <= thedate 
                        AND TRUNC(ACTIVITY_END_DATE) >= add_months( trunc(thedate,'mm'), -12) 
                        AND SYSDATE  >=  trunc(thedate,'mm') then 1 else 0 end ) ) as OTR12 
        FROM TEST cross join
             (  select add_months(last_day(SYSDATE), level-7) as thedate 
                from dual connect by level <= 12  )  
        GROUP BY thedate 
     ) t
order by thedate
票数 0
EN

Stack Overflow用户

发布于 2013-04-04 05:58:37

使用having子句:

代码语言:javascript
复制
having 
SUM( case when TRUNC(ACTIVITY_END_DATE) <= thedate 
 AND TRUNC(ACTIVITY_END_DATE) >= add_months( trunc(thedate,'mm'), -12) 
 AND SYSDATE  >=  trunc(thedate,'mm') then 1 else 0 end ) ) as OTR12 
   FROM TEST
   cross join (  select add_months(last_day(SYSDATE), level-7) as thedate 
   from dual connect by level <= 12  )
> 0
票数 1
EN

Stack Overflow用户

发布于 2013-04-04 06:08:54

代码语言:javascript
复制
SELECT 
  thedate, 
  ROUND (
    100 * SUM( 
       case when TRUNC(ACTIVITY_END_DATE) <= thedate
       AND TRUNC(ACTIVITY_END_DATE) >= add_months( trunc(thedate,'mm'), -12) 
       AND trunc(ACTIVITY_END_DATE) <= trunc(ACTIVITY_NEED_DATE) 
       AND SYSDATE  >=  trunc(thedate,'mm') then 1 else 0 end 
    ) / nullif(SUM( 
       case when TRUNC(ACTIVITY_END_DATE) <= thedate 
       AND TRUNC(ACTIVITY_END_DATE) >= add_months( trunc(thedate,'mm'), -12) 
       AND SYSDATE  >=  trunc(thedate,'mm') then 1 else 0 end 
    ), 0) 
  ) as OTR12 
FROM 
  TEST
  cross join (  
     select add_months(last_day(SYSDATE), level-7) as thedate 
     from dual connect by level <= 12  
  )  
GROUP BY thedate 
ORDER BY thedate 
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15798910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档