Oracle语句求教,解决思路

Oracle语句求教,急..........................................
例如:
tab1(销售订单表):
编号         客户           业务员             商品           单价           数量           时间  
SO001      1号店          小明               苹果4          3000          200            2013-07-05
SO002      2号店          小明               苹果5          4200          100            2013-08-05
SO003      1号店          小明               苹果4S        3500          300            2013-07-13
SO004      3号店          小明               苹果4          3000          350            2013-08-09
SO005      2号店          小明               苹果5          4100          600            2013-08-18
SO006      4号店          小明               苹果5S         4500         150            2013-09-07
SO001      3号店          小明               苹果4          3100          100            2013-08-23
SO001      4号店          小明               苹果4S        3600          700            2013-09-16
SO001      1号店          小明               苹果4          3200          400            2013-07-22


希望统计得到苹果4的销售数量:
商品         客户           7月数量    8月数量      9月数量
苹果4       1号店           600            0               0
苹果4       3号店            0              450            0

PS:现在有2个参数日期,一个开始日期和结束日期,根据日期来决定查询的月份。
如参数开始日期:2013-05-16,结束日期:2013-09-17
那么我查询到的月份字段就有5月数量、6月数量、7月数量、8月数量、9月数量,而5月份的数据必须是5月16号之后的,同样,9月统计的数量必须是9月17号之前的。

求语句,我现在的做法是根据2个日期得到月份,然后循环月份,把月份放进SQL语句执行,每个月每个月的查,如果我2个日期区间有10个月,那么我一条数据就要访问10次数据库,导致查询效率大大降低。查询到的数据还没100条,却要花上将近1分钟的时间。像这种直接统计的不会啊,求大神Oracle语句求教,解决思路
------解决方案--------------------
test  试试看可以么


CREATE OR REPLACE PROCEDURE P_TEST (B_DATE IN DATE,E_DATE IN DATE)
IS
  V_SQL VARCHAR2(2000);
  CURSOR CURSOR_1 IS 
  SELECT DISTINCT TO_CHAR(T.SJ,'MM') SJ 
  FROM tab1 T
  WHERE T.SJ BETWEEN B_DATE AND E_DATE
  ORDER BY TO_CHAR(T.SJ,'MM'); 
    
    BEGIN
      V_SQL := 'SELECT KH,SP ';