业务描述: 产品表 产品编号 尺寸(码) 颜色 数量 1 38 黑 100 1 38 红 10 1 40 黑 50 2 38 黑 100 3 38 红 5 产品名称表 产品编号 产品名称 1 红蜘蛛皮鞋 2 蓝蜘蛛布鞋 3 黑寡妇皮鞋 要求展示报表如下: 统计报表 尺寸/颜色 黑 红 38 200 15 40 50 0 建表: create table T_SHOES ( P_ID NUMBER(10), P_SIZE NUMBER(3), P_COLOR VARCHAR2(6), P_NUM NUMBER(5) ); 输入测试数据如下: select p_id, p_size, p_color, p_num from t_shoes; P_ID P_SIZE P_COLOR P_NUM 1 38 黑 100 1 38 红 10 1 40 黑 50 2 38 黑 100 3 38 红 5 因为结果集要通过存储过程,所以创建结果统计报表: create table t_shoes_report ( P_SIZE NUMBER(3), P_COLOR VARCHAR2(6), P_NUM NUMBER(5) ); 创建视图,以提供所有颜色和尺寸的匹配情况(利用了笛卡尔乘积) create or replace view v_all_products as select distinct all_size.p_size,all_color.p_color from (select distinct t.p_size from t_shoes t ) all_size, (select distinct t.p_color from t_shoes t) all_color 通过逐步打印,完成以下存储过程的编写: create or replace procedure sp_report as str1 number(3); str2 varchar2(30000); begin delete from t_shoes_report; for all_size in (select distinct p_size from v_all_products ) loop --dbms_output.put_line(all_size.p_size); for all_color in ( select distinct p_color from v_all_products where p_size = all_size.p_size) loop --dbms_output.put_line(all_size.p_size||','||all_color.p_color); --统计 select nvl(sum(t.p_num),0) into str1 from t_shoes t where t.p_size = all_size.p_size and t.p_color = all_color.p_color; --str2 := all_size.p_size||','||all_color.p_color||','||str1; --dbms_output.put_line(str2); insert into t_shoes_report(p_size,p_color,p_num) values(all_size.p_size,all_color.p_color,str1); end loop; end loop; commit; end ; 测试: SQL> execute sp_report; PL/SQL procedure successfully completed SQL> select * from t_shoes_report; P_SIZE P_COLOR P_NUM 表A ------ ------- ------ 38 黑 200 38 红 15 40 黑 50 40 红 0 在得到上面的数据,可以通过以下方法进行报表显示 报表 尺寸/颜色 黑 红 38 200 15 40 50 0 1、通过java程序将表A数据转化HTML代码,显示为表B 2、通过SQL语句转化 select t.p_size 尺寸, sum(decode(t.p_color,'黑',t.p_num)) 黑, sum(decode(t.p_color,'红',t.p_num)) 红 from t_shoes_report t group by t.p_size 结果: 尺寸 黑 红 38 200 15 40 50 0