今天做一条关于统计的SQL语句,始终不得其解,其需求如下:表A:字段A1,number类型,主键
     字段A2,varchar2类型,插入的数据是从表C里取到的值,即与C1关联
     字段A3,varchar2类型,插入的数据是从表B里取到的值,即与B1关联
表B:字段B1,number类型,主键
     字段B2,varchar2类型,数据里只有(b1,b2,b3,b4,b5)五行
表C:字段C1,number类型,主键
     字段C2,varchar2类型,数据里只有(c1,c2,c3)三行
表D(日志表):
     表A插入一条数据时,此表插入一条数据;
     表A修改一条数据时,此表插入一条数据
     字段D1,number类型,主键
     字段D2,varchar2类型,0为新增,1为修改
     字段D3:date类型,插入时间
     字段D4:number类型,与表A的字段A1关联
--------------------------------------
显示结果:行要显示b1,b2,b3,b4,b5所有五项,以及每一项里对应的c1,c2,c3三项。
列为D3的最近N天(可以通过查询取得时间段),暂且默认他七天吧也就是说我统计的是B2所有的五项里,每一项对应的C2的三小项每天增加修改的数量,及其之和。大致查询后的列表如下:本行显示的是列名:   B2  C2      10月28日          10月29日   10月30日  10月31日   11月1日 11月2日  11月3日  合计 
                     b1  c1  D2增加与修改的数目和  同左边    同左边    同左边    同左边   同左边   同左边   合计
                     b1  c2       同上边           同左边    同左边    同左边    同左边   同左边   同左边   合计
                     b1  c3       同上边           同左边    同左边    同左边    同左边   同左边   同左边   合计
                     b2  c1       同上边           同左边    同左边    同左边    同左边   同左边   同左边   合计
                     b2  c2       同上边           同左边    同左边    同左边    同左边   同左边   同左边   合计  
                     b2  c3       以下省略
                     b3  c1
                     b3  c2
                     b3  c3
                     b4  c1
                     b4  c2
                     b4  c3
                     b5  c1
                     b5  c2
                     b5  c3

解决方案 »

  1.   

    select b.B2,
           c.C2,
           sum(decode(d.d3), to_date('2010-10-28', 'yyyy-mm-dd'), 1, 0),
           sum(decode(d.d3), to_date('2010-10-29', 'yyyy-mm-dd'), 1, 0),
           sum(decode(d.d3), to_date('2010-10-30', 'yyyy-mm-dd'), 1, 0),
           sum(decode(d.d3), to_date('2010-10-31', 'yyyy-mm-dd'), 1, 0),
           sum(decode(d.d3), to_date('2010-10-1', 'yyyy-mm-dd'), 1, 0),
           sum(decode(d.d3), to_date('2010-10-2', 'yyyy-mm-dd'), 1, 0),
           sum(decode(d.d3), to_date('2010-10-3', 'yyyy-mm-dd'), 1, 0),
           count(*)
      from A a, C c, B b, D d
     where a.A2 = c.C1
       and a.A3 = b.B1
       and b.B2 in ('b1', 'b2', 'b3', 'b4', 'b5')
       and c.C2 in ('c1', 'c2', 'c3')
       and a.A1 = d.D4
       and d.D3 >= sysdate - 7
     group by b.B2, c.C2
      

  2.   

    表A:
    A1(number,序列ID)  A2    A3 (此列为字段名)
    1                  11    21
    2                  11    22
    3                  13    21
    4                  13    23
    5                  14    21
    6                  14    21
    7                  14    22表B:
    B1(number,序列ID)   B2(varchar2) (此列为字段名)
    11   b1
    12   b2
    13   b3
    14   b4
    15   b5表C:
    C1(number,序列ID)   C2(varchar2) (此列为字段名)
    21   c1
    22   c2
    23   c3表D
    D1   D2(varchar2,0为增加,1为修改)  D3(date插入时间)   D4(与A1关联)   (此列为字段名)
    1     0       10月28日     1
    2     0       10月29日     2
    3     1       10月30日     1
    4     0       10月27日     3
    5     0       11月2日      4
    6     1       11月2日      4
    7     0       11月3日      5
    8     0       10月28日     6
    9     0       10月28日     7
    10    1       10月28日     6
    统计结果:
    B2 C2 10月28日 10月29日 10月30日 10月31日 11月1日 11月2日 11月3日 合计 (此列为字段名)
    b1 c1    1   0   1   0   0   0   0   2(28日增加1次,30日修改1次)
    b1 c2    0   1   0   0   0   0   0   1(29日增加1次)
    b1 c3    0   0   0   0   0   0   0   0
    b2 c1    0   0   0   0   0   0   0   0
    b2 c2    0   0   0   0   0   0   0   0
    b2 c3    0   0   0   0   0   0   0   0
    b3 c1    0   0   0   0   0   0   0   0
    b3 c2    0   0   0   0   0   0   0   0
    b3 c3    0   0   0   0   0   2   0   2(2日增加1次,修改1次)
    b4 c1    2   0   0   0   0   0   1   3(28日增加1次,修改1次对应A1的6,3日增加1次对应A1的5)
    b4 c2    1   0   0   0   0   0   0   0(28日增加1次)
    b4 c3    0   0   0   0   0   0   0   0
    b5 c1    0   0   0   0   0   0   0   0
    b5 c2    0   0   0   0   0   0   0   0
    b5 c3    0   0   0   0   0   0   0   0   整理了一下大致如上
      

  3.   


    -- you answer!
    with A as(
    select 1 A1, '11' A2, '21' A3 from dual union all
    select 2, '11', '22' from dual union all
    select 3, '13', '21' from dual union all
    select 4, '13', '23' from dual union all
    select 5, '14', '21' from dual union all
    select 6, '14', '21' from dual union all
    select 7, '14', '22' from dual
    ),
    B as(
    select 11 B1, 'b1' B2 from dual union all
    select 12, 'b2' from dual union all
    select 13, 'b3' from dual union all
    select 14, 'b4' from dual union all
    select 15, 'b5' from dual
    ),
    C as(
    select 21 C1, 'c1' C2 from dual union all
    select 22, 'c2' from dual union all
    select 23, 'c3' from dual
    ),
    D as(
    select 1 D1, '0' D2, to_date('10-28','mm-dd') D3, 1 D4 from dual union all
    SELECT 2, '0', to_date('10-29','mm-dd'), 2 from dual union all
    select 3, '1', to_date('10-30','mm-dd'), 1 from dual union all
    select 4, '0', to_date('10-27','mm-dd'), 3 from dual union all
    select 5, '0', to_date('11-02','mm-dd'), 4 from dual union all
    select 6, '1', to_date('11-02','mm-dd'), 4 from dual union all
    select 7, '0', to_date('11-03','mm-dd'), 5 from dual union all
    select 8, '0', to_date('10-28','mm-dd'), 6 from dual union all
    select 9, '0', to_date('10-28','mm-dd'), 7 from dual union all
    select 10,'1', to_date('10-28','mm-dd'), 6 from dual
    ),
    bc as(select b1||'' b1,c1||'' c1,b2,c2 from b,c),
    ad as(select d.*,a1,a2,a3 from a,d where d.d4=a.a1),
    temp as(
        select t1.b2,t1.c2,
               sum(Decode(t2.d3,to_date('10-28','mm-dd'),1,0)) col1,
               sum(Decode(t2.d3,to_date('10-29','mm-dd'),1,0)) col2,
               sum(Decode(t2.d3,to_date('10-30','mm-dd'),1,0)) col3,
               sum(Decode(t2.d3,to_date('10-31','mm-dd'),1,0)) col4,
               sum(Decode(t2.d3,to_date('11-01','mm-dd'),1,0)) col5,
               sum(Decode(t2.d3,to_date('11-02','mm-dd'),1,0)) col6,
               sum(Decode(t2.d3,to_date('11-03','mm-dd'),1,0)) col7,
               Count(*) cnt
        from bc t1 , ad t2
        where t1.b1=t2.a2 and t1.c1=t2.a3
        group by t1.b2,t1.c2
        order by t1.b2,t1.c2
    )
    select x.b2,x.c2,Nvl(col1,0)"10-28",Nvl(col2,0)"10-29",Nvl(col3,0)"10-30",
    Nvl(col4,0)"10-31",Nvl(col5,0)"11-01",Nvl(col6,0)"11-02",Nvl(col7,0)"11-03",
    Nvl(cnt,0) cnt
    from bc x left join temp y
    on x.b2=y.b2 and x.c2=y.c2
    B2 C2 10-28 10-29 10-30 10-31 11-01 11-02 11-03  CNT
    --------------------------------------------------------------
    b1 c1   1     0     1     0    0     0     0     2
    b1 c2   0     1     0     0     0     0     0     1
    b3 c1   0     0     0     0     0     0     0     1
    b3 c3    0     0     0     0     0     2     0     2
    b4 c1   2     0     0     0     0     0     1     3
    b4 c2   1     0     0     0     0     0     0     1
    b2 c1    0    0     0     0     0     0     0     0
    b3 c2   0     0     0     0     0     0     0     0
    b4 c3   0     0     0     0     0     0     0     0
    b2 c2   0     0     0     0     0     0     0     0
    b5 c3   0     0     0    0     0     0     0     0
    b1 c3   0     0     0     0     0    0     0     0
    b5 c1   0     0    0     0     0    0     0     0
    b5 c2   0     0    0     0     0     0    0     0
    b2 c3   0     0     0     0     0     0     0    0
      

  4.   

    补充点,你B,C表中B1,C1是number型,和A表A2,A3 varchar2类型不匹配,因此我临时表bc进行了转换
    另外,我上面的SQL可以加个排序,order by x.b2,x.c2这样好看点,跟你结果一样!我忘了加排序。哎你这个我搞了差不多2个小时,睡觉了
      

  5.   

    呵呵,谢谢 gelyon 的帮助,在你的帮忙下我已经解决了问题,再次谢谢。结贴给分。