sign()函数根据某个值是0、正数还是负数,分别返回0、1、-1
例如:
变量1=10,变量2=20
则sign(变量1-变量2)返回-1,decode解码结果为“变量1”,达到了取较小值的目的。
2. 自定义排序
WITH a AS (
SELECT 'a' T FROM DUAL UNION ALL
SELECT 'b' FROM DUAL UNION ALL
SELECT 'c' FROM DUAL)
SELECT * FROM A ORDER BY DECODE(T, 'a', 1, 'c', 2, 'b', 3)
3. 代替case、if/else
decode(表达式,值1,结果1,值2,结果2,默认值)
要说明的是,表达式与结果都可以为子查询语句。
4. 使用decode进行分组统计,行转列分组统计
WITH test AS(
SELECT 'A' 科室,'药费' 费用类别,10 费用 FROM dual UNION ALL
SELECT 'B' ,'药费' ,20 FROM dual UNION ALL
SELECT 'C' ,'药费' ,20 FROM dual UNION ALL
SELECT 'A' ,'耗材' ,10 FROM dual UNION ALL
SELECT 'B' ,'耗材' ,20 FROM dual UNION ALL
SELECT 'C' ,'耗材' ,20 FROM dual UNION ALL
SELECT 'A' ,'麻醉' ,10 FROM dual UNION ALL
SELECT 'B' ,'麻醉' ,20 FROM dual UNION ALL
SELECT 'C' ,'麻醉' ,20 FROM dual UNION ALL
SELECT 'C' ,'手术' ,20 FROM dual UNION ALL
SELECT 'C' ,'药费' ,10 FROM dual
)
SELECT 科室,
SUM(DECODE(费用类别, '药费', 费用, 0)) 药费,
SUM(DECODE(费用类别, '耗材', 费用, 0)) 药费,
SUM(DECODE(费用类别, '药费' ,0, '耗材', 0, 费用)) 其他
FROM TEST
GROUP BY 科室;