没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
数据分层汇总交叉报表 SQL 语句实现方法
在管理系统中,管理人员往往需要对业务数据进行不同需求的分层汇总,并产生各种形式交
叉报表。为了实现此类报表,程序员需要构造层次结构非常复杂的 SQL 语句,甚至使用前台编程
工具或其它报表工具来完成。
以下通过二个实例,介绍此类报表的实现方法。
一、WITH as 语句
使用 WITHAS语句可以为一个子查询语句块定义一个名称,使用这个子查询名称可以在查询
语句的很多地方引用这个子查询。Oracle数据库像对待内联视图或临时表一样对待被引用的子查
询名称,从而起到一定的优化作用。with 子句是 9i 新增语法。你可以在任何一个顶层的 SELECT
语句以及几乎所有类型的子查询语句前,使用子查询定义子句。被定义的子查询名称可以在主查
询语句以及所有的子查询语句中引用,但未定义前不能引用。with 子句中不能嵌套定义<也就是
with 子句中不能有 with 子句>,但子查询中出现的“子查询定义”语句可以引用已定义的子查询名
称。<可以引用前面已经定义的 with 子句>。
复杂的查询会产生很大的 sql,with as 语法显示一个个中间结果,显得有条理些,可读性与易
维护性大为提高。前面的中间结果可以被语句中的 select 或后面的中间结果表引用,类似于一个
范围仅限于本语句的临时表,在需要多次查询某中间结果时可以提升效率。
语法结构:
with t1 as (
...
),t2 as (
..
)
二、字典准备
为了实现数据分层汇总交叉报表,需要建立行的层次结构表与列的交叉汇总对照表。
1、 交叉汇总对照表:一般分为,代码字段与代码汇总二个字段。
如:SELECT fee_code,fee_stat_cate FROM FIN_COM_FEECODESTAT WHERE REPORT_CODE = 'ZY11'
FEE_CIDE 为数据表中的费用代码,FEE_STAT_CATE 为费用汇总归类代码。
2、层次结构表:一般分为,需要分层汇总的代码、汇总报表行标题、汇总报表排序代码、层次
代码、分层汇总的父节点代码与报表显示标志。
如:某报表按科室汇总产生分层报表的层次结构表如下:
DEPT_CODE DEPT_NAME SORTID ROOTLEVEL LEVEL_DEPT SHOW_F
1 S001
本月合计
01 2 S100 1
2 S005
内科
1 2 S001 1
3 0014
消化内科
11 3 S005 1
4 0015
血液内科
12 3 S005 1
5 0011
内科心血管
13 3 S005 1
6 0013
内分泌科
14 3 S005 1
7 0016
呼吸内科
15 3 S005 1
8 0017
肾病内科
16 3 S005 1
9 S006
综合科
2 2 S001 1
10 0033
综合一
21 3 S006 1
11 0034
综合二
22 3 S006 1
12 0035
综合三
23 3 S006 1
13 0036
综合四
24 3 S006 1
14 0048
综合五
25 3 S006 1
15 0037
综合六
26 3 S006 1
16 0019
感染科
3 2 S001 1
17 0018
神经内科
4 2 S005 1
18 S002
外科
5 2 S001 1
19 S007
普外科
51 3 S002 1
20 0042
肝胆胰外科一病区
5101 4 S007 1
21 0002
肝胆胰外科二病区
5102 4 S007 1
22 0001
甲乳疝血管外科病区
5103 4 S007 1
23 0003
结直肠肛门外科病区
5104 4 S007 1
24 0004
胸外科
52 3 S002 1
25 0006
泌尿外科
5202 3 S002 1
26 0005
脑外科
5203 3 S002 1
27 S003
骨科
53 3 S002 1
28 0009
创伤修复病区
5301 4 S003 1
29 0008
显微、手外科病区
5302 4 S003 1
30 0040
脊柱外科一病区
5303 4 S003 1
31 0044
骨肿瘤、脊柱外科二病区
5304 4 S003 1
32 0045
关节外科病区
5305 4 S003 1
33 0046
创伤骨科病区
5306 4 S003 1
34 S015
肝胆研究院
54 3 S002 1
35 0054
肝胆研究院一
57 4 S015 1
36 0079
肝胆研究院二
58 4 S015 1
37 S016
儿科
6 2 S001 1
38 0038
儿科
61 3 S016 1
39 0039
新生儿
62 3 S016 1
40 S008
妇产科
7 2 S001 1
41 0027
妇科
71 3 S008 1
42 0029
产科
72 3 S008 1
43 0024
耳鼻喉科
8 2 S017 1
44 0025
眼科
9 2 S017 1
45 0032
皮肤科
A 2 S001 1
46 0026
口腔科
A0 2 S017 1
SQL 语句: select * from COM_DEPT_FATHER
Dept_code 科室代码 dept_bane 科室结构名称 Sortid 科室结构排序 Rootlevel 科室层次
Level_dept 父节点代码 SHOW_F 报表显示列
三、实现方法
1、业务数据
如:原始数据表:FIN_IPB_FEEINFO
INHOS_DEPTCODE FEE_CODE TOT_COST BALANCE_DATE
1 0013 055 47.00 2012-12-29 08:54:11
2 0013 619 8.00 2012-12-29 08:54:11
3 0013 181 240.00 2012-12-29 08:54:11
4 0013 053 9.50 2012-12-29 08:54:11
5 0013 181 70.00 2012-12-29 08:54:11
6 0013 053 9.50 2012-12-29 08:54:11
7 0013 141 123.00 2012-12-29 08:54:11
8 0013 888 72.50 2012-12-29 08:54:11
9 0013 001 106.85 2012-12-29 08:54:11
10 0013 171 35.00 2012-12-29 08:54:11
11 0013 171 487.00 2012-12-29 08:54:11
12 0013 001 8.97 2012-12-29 08:54:11
13 0013 620 8.00 2012-12-29 08:54:11
14 0013 531 8.00 2012-12-29 08:54:11
15 0013 055 47.00 2012-12-29 08:54:11
16 0013 619 8.00 2012-12-29 08:54:11
17 0013 171 30.00 2012-12-29 08:54:11
18 0013 171 31.00 2012-12-29 08:54:11
19 0013 221 550.00 2012-12-29 08:54:11
20 0013 002 -100.50 2012-12-29 08:54:11
21 0013 001 -8.97 2012-12-29 08:54:11
22 0013 171 15.00 2012-12-29 08:54:11
23 0001 531 8.00 2012-12-29 08:54:11
24 0001 055 32.00 2012-12-29 08:54:11
25 0001 620 4.00 2012-12-29 08:54:11
26 0001 619 8.00 2012-12-29 08:54:11
字 段 名 称 INHOS_DEPTCODE 科 室 代 码 、 FEE_CODE 费 用 代 码 、 TOT_COST 金 额 、
BALANCE_DATE 统计日期
2、生成交叉表
利用交叉汇总对照表,生成各底层统计单位的交叉表。SQL 语句如下:
select a.INHOS_DEPTCODE,
剩余15页未读,继续阅读
资源评论
- maya1299212013-09-26不好用,很麻烦
sjg30317
- 粉丝: 0
- 资源: 4
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功