我在Crystal报表中有这段代码。它使用2个字段st.pass_total
和st.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)
答案 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
对于第一个select
,您可能还希望使用函数round()
对值进行舍入,就像我在SQLFiddle中所做的那样 -
(如果你不这样做,你可能会在报告中出现溢出错误。)