在Oracle中,可以使用动态SQL语句生成交叉表(Cross Tab)。交叉表可以将分类数据进行交叉汇总,生成简洁直观的报表。这里给出一个示例,查询员工部门和工种的交叉表:
DECLARE v_sql VARCHAR2(4000); BEGIN v_sql := 'SELECT DEPTNO AS "部门号", JOB AS "工种", '; FOR i IN (SELECT DEPTNO FROM DEPT) LOOP v_sql := v_sql||'SUM(CASE WHEN DEPTNO = '||i.DEPTNO||' THEN 1 ELSE 0 END) "'||i.DEPTNO||'", '; END LOOP; v_sql := RTRIM(v_sql,', '); v_sql := v_sql||' FROM EMP GROUP BY DEPTNO, JOB'; EXECUTE IMMEDIATE v_sql; END;
该代码的执行流程如下:
1. 声明一个变量v_sql,用于动态拼接SQL语句。
2. 查询DEPT表获取所有部门号,循环拼接SUM函数及CASE WHEN语句,用于统计每个部门的员工数。
3. 利用RTRIM函数去除SQL最后的`, `,拼接完整的SQL语句。
4. 使用EXECUTE IMMEDIATE执行动态SQL语句。
5. 结果生成一个部门和工种的交叉表,每个部门的员工数在对应的列中统计。
该示例 Generate 了以下交叉表结果:
DEPTNO 工种 10 20 30 ------- -------- ---------- ---------- ---------- ACCOUNT 3 1 0 CLERK 1 1 2 MANAGER 1 1 1 SALESMAN 2 5 0
通过动态SQL,我们可以灵活地根据业务需求生成各种复杂的交叉表。如果表之间有层级关系,还可以生成层级交叉表。
© 版权声明
本文刊载的所有内容,包括文字、图片、音频、视频、软件、程序、以及网页版式设计等部门来源于互联网,版权均归原作者所有!本网站提供的内容服务于个人学习、研究或欣赏,以及其他非商业性或非盈利性用途,但同时应遵守著作权法及其他相关法律的规定,不得侵犯本网站及相关权利人的合法权利。
联系信息:邮箱aoxolcom@163.com或见网站底部。
联系信息:邮箱aoxolcom@163.com或见网站底部。
THE END
请登录后发表评论
注册
社交帐号登录