Crystal报告中的Oracle计算

时间:2015-06-01 22:32:50

标签: oracle

我在Crystal报表中有这段代码。它使用2个字段st.pass_totalst.fail_total来计算通过率。我想用PL / SQL代码替换这个Crystal代码,只返回pass_ratio:

if isnull({st.PASS_TOTAL}) 
   and isnull({st.FAIL_TOTAL}) then pass_ratio:=""
else if (not isnull({st.PASS_TOTAL})) 
        and isnull({st.FAIL_TOTAL}) then pass_ratio:="100%"
else if (isnull({st.PASS_TOTAL})
           or {st.PASS_TOTAL}=0) 
         and (not isnull({st.FAIL_TOTAL})) then pass_ratio:=""
else pass_ratio:=totext({st.PASS_TOTAL}/({st.PASS_TOTAL}+{st.FAIL_TOTAL})*100)+"%";

这就是我在PL / SQL中所拥有的,这是正确的吗?

decode((is_null(st.pass_total) AND is_null(st.fail_total)), "",
       (not is_null(st.pass_total) AND not is_null(st.fail_total)), "100%",
       ((is_null(st.pass_total) OR st.pass_total=0) && not is_null(st.fail_total)), "",
       (st.pass_total/(st.pass_total+st.fail_total)*100)||"%"))

我还有一个"计算"截止值:

if {e.eve_cutoff}=0
   or isnull({e.eve_cutoff}) then event_cutoff:="140"
else if {e.eve_cutoff}>0 then event_cutoff:=totext({e.eve_cutoff},0);

这就是我在PL / SQL中所拥有的,这是正确的吗?

decode(e.eve_cutoff, 0, "140",
       e.eve_cutoff, NULL, "140",
       eve_cutoff)

1 个答案:

答案 0 :(得分:1)

您的decode语句有几个问题。使用函数nvl()

可以大大简化此语法
select 
    case 
      when nvl(st.pass_total, 0) = 0 then ''
      else 100 * st.pass_total / (st.pass_total + nvl(st.fail_total, 0)) ||'%' 
    end ratio
  from st

select decode(nvl(eve_cutoff, 0), 0, '140', eve_cutoff) cutoff from e

[SQLFiddle1][SQLFiddle2]

对于第一个select,您可能还希望使用函数round()对值进行舍入,就像我在SQLFiddle中所做的那样 - (如果你不这样做,你可能会在报告中出现溢出错误。)