有2个table
table a 存放用户基本信息id   name  ...
A001 Apple ...
A002 Bill  ...
...table b 存放发票号,付款日期,金额,一个月一个用户可以有多张发票,对应的也有多个金额id    bill_num       payment_date    amount
A001  b_bj_07/0201   02/01/2007      500
A001  b_bj_07/0202   02/02/2007      600
A001  b_bj_07/0301   03/01/2007      700
A002  b_sy_07/0101   01/01/2007      800
...现在要把这里两个表的数据显示出来,一个客户一行,
bill_num输入该用户该年所有发票号,接下来的每个月显示该客户该月的所有金额,格式如下:id    name    bill_num     Jan    Feb    Mar...(一共12个月)
----------------------------------------------------------------
A001  Apple   b_bj_07/0201  0     1100   700    ...
              b_bj_07/0202
              b_bj_07/0301
----------------------------------------------------------------
A002  Bill    b_sy_07/0101  800    0     0      ...请问这样能用一句SQL写出来吗?

解决方案 »

  1.   

    这种要求应该可以用一句SQL写出来,但要分解考虑后再合并到一起。思路:
     1、完成前部分,a、b 关联一下,之后判断每组除第一名之外,空白显示:
    id    name    bill_num     
    ---------------------------
    A001  Apple   b_bj_07/0201 
                  b_bj_07/0202
                  b_bj_07/0301
    ----------------------------
    A002  Bill    b_sy_07/0101  内核sql类似如下:
    SELECT c.id,c.name,c.bill_num,  
       row_number() over(partition by c.id,c.name order by c.bill_num) as cu1 
    FROM 
     (select a.id,a.name,b.bill_num
     from a,b
     where a.id=b.id(+)) c
    order by c.bill_num
    之后decode(cu1,1,c.id,''),decode(cu1,1,c.name,'')
      

  2.   

    2、完成后部分,
    Jan    Feb    Mar...(一共12个月)
    ------------------------------------
    0     1100   700    ...------------------------------------
    800    0     0      ...     2-1、创建b的子表,以id,
              substr(payment_date,1,2)||substr(payment_date,7,4) as xxx分组统计amount;
             之后列传行
              decode(xxx,'012007',amount的和) as Jan,
              decode(xxx,'022007',amount的和) as Feb,
              .......
         2-2、b的子表与a关联,用id,完成后半部分的主要格式。
      

  3.   

    有那么多的报表工具,何必让oracle消耗那么多的资源。如果是pb实现这个是很简单的,我相信其它开发工具也有类似的报表工具。还有图表工具也和这个类似,还是让客户计算机来计算的好。