`
java1573
  • 浏览: 120888 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

交叉报表实战:皮鞋规格颜色统计

阅读更多

知识点:decode,sum,计算列,存储过程

业务描述:
产品表    
产品编号 尺寸(码)  颜色  数量
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

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics