ORACLE统计报表
ORACLE统计报表
刚进公司没多久的小菜鸟,就让我统计一份报表,写了一个礼拜的sql也没搞出来,后来大神给了篇学习文档才搞出来的,唉,是真的难…咳咳…不煽情了…
需求:
根据分公司统计某项目的阶段进度情况
技术:
- GROUPING函数可以接受一列,返回0或者1。如果列值为空,那么GROUPING()返回1;如果列值非空,那么返回0。GROUPING只能在使用ROLLUP或CUBE的查询中使用。当需要在返回空值的地方显示某个值时,GROUPING()就非常有用。
- ROLLUP函数 和 CUBE函数使用
代码:
SELECT *
FROM (SELECT CASE
WHEN GROUPING(BR.ORGID) = 1 THEN
'合计'
ELSE
MIN(BR.ORGNAME)
END 分公司,
CASE
WHEN GROUPING(BR.ORGID) = 1 THEN
999999
ELSE
MIN(BR.ORDER)
END 排序,
SUM(T.JDA) 阶段一完成数,
SUM(T.JDB) 阶段二完成数,
SUM(T.JDC) 阶段三完成数,
SUM(T.JDD) 阶段四完成数
FROM (SELECT F.PID,
O.ORGID,
O.ORDER,
DECODE(ES.A, NULL, 0, 1) JDA,
DECODE(ES.B, NULL, 0, 1) JDB,
DECODE(ES.C, NULL, 0, 1) JDC,
DECODE(ES.D, NULL, 0, 1) JDD
FROM PROJECT_TABLE F, SCHEDULE_TABLE ES, ORGTABLE O
WHERE F.PID = ES.PID
AND F.ORGID = O.ORGID
AND F.PID = ?) T,
ORGTABLE BR
WHERE BR.ORGID = T.ORGID(+)
GROUP BY ROLLUP(BR.ORGID)) TT
ORDER BY TT.排序;
结果集: