1、ORACLE中DECODE()函数在数据统计中的应用
如有一个网上交易受理日志表SALE_LOG,表结构为:
ID VARCHAR2(20) --主键
OPER_MONTH VARCHAR2(6), --月份(YYYYMM)
OPER_DATE VARCHAR2(8), --日期(YYYYMMDD)
OPER_TIME VARCHAR2(6), --时间(hh24miss)
GOODS_ID VARCHAR2(20), --商品ID
GOODS_NAME VARCHAR2(100), --商品名称
GOODS_TYPE VARCHAR2(1), --商品类型(A、B、C等)
GOODS_PRIZE NUMBER(10,2) --商品价格
SUCCEED VARCHAR2(1), --交易结果(0:失败;1:成功)
现在需要统计"交易发起总笔数"、"交易发起总金额"、"成功交易笔数"、"成功交易总金额"、
"交易成功率"、"商品A、B交易发起的总笔数"、"商品A、B交易发起的总金额"等,如果要在一条SQL中实现,
则用DECODE()函数将会使SQL语句变得相对简洁(当然用其它的方式也能达到相同的效果),在这里写了个,仅作参考:
SELECT COUNT (ID) 交易发起总笔数,
SUM (GOODS_PRIZE) 交易发起总金额,
COUNT (DECODE(SUCCEED, '1', SUCCEED)) 成功交易笔数,
SUM (DECODE(SUCCEED, '1', SUCCEED)) 成功交易总金额,
ROUND(100*COUNT (DECODE (succeed, '1', succeed))
/ COUNT (succeed),2)||'%' 交易成功率,
COUNT (DECODE(GOODS_TYPE, 'A', 'A','B','B')) 商品A、B交易发起的总笔数,
SUM (DECODE(GOODS_TYPE, 'A', GOODS_PRIZE,'B',GOODS_PRIZE)) 商品A、B交易发起的总金额,
COUNT (DECODE(DECODE(GOODS_TYPE, 'A', SUCCEED,'B',SUCCEED),'1','1')) 商品A、B成功交易笔数,
SUM (DECODE(DECODE(GOODS_TYPE, 'A', SUCCEED,'B',SUCCEED),'1',GOODS_PRIZE)) 商品A、B成功交易金额,
ROUND(100*COUNT (DECODE (DECODE(GOODS_TYPE, 'A', SUCCEED,'B',SUCCEED), '1', '1'))
/ COUNT (DECODE(GOODS_TYPE, 'A', SUCCEED,'B',SUCCEED)),2)||'%' 商品A、B交易成功率,
FROM SALE_LOG;
附:DECODE()函数的定义
decode(条件,值1,翻译值1,值2,翻译值2,...值n,翻译值n,缺省值)
该函数的含义如下:
IF 条件=值1 THEN
RETURN(翻译值1)
ELSIF 条件=值2 THEN
RETURN(翻译值2)
......
ELSIF 条件=值n THEN
RETURN(翻译值n)
ELSE
RETURN(缺省值)
END IF
另一应用:比较大小
select decode(sign(变量1-变量2),-1,变量1,变量2) from dual; --取较小值
sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。