我现在有一个这样的统计需求.
人员表person_info,从此表中统计用户创建了多少人员,修改了多少人员.
我是先查出用户创建数,然后查出修改数,两个再full join
select tta.province_name as create_province,ttb.province_name as modify_province,tta.owner_name,ttb.modify_name,tta.person_num,ttb.person_num1 from 
( select  province_name,owner_name,count(owner_name) as person_num  from  ads.person_info a  where 1=1 and trunc(create_time)>=to_date('2008-09-01','yyyy-mm-dd') and trunc(create_time)<=to_date('2008-09-22','yyyy-mm-dd') group by province_name,owner_name )tta
full join
(select  province_name,modify_name,count(modify_name) as person_num1  from  ads.person_info b  where 1=1 and modify_time>create_time  and trunc(modify_time)>=to_date('2008-09-01','yyyy-mm-dd') and trunc(modify_time)<=to_date('2008-09-22','yyyy-mm-dd') group by province_name,modify_name )  ttb
on tta.owner_name=ttb.modify_name 
单独查创建的数量为北京 xuser1 1
单独查修改的数量为安徽 黄某某  1
join后就成了北京        xuser1 1
               安徽    黄某某    
黄用户的修改数量查不出来啊?请问如何解决这种问题啊?

解决方案 »

  1.   

    COUNT(MOFIFY_NAME) AS PERSON_NUM1有数据吗?有没有在PERSON_NUM1加了什么函数了还是没有显示出来。
    SQL>  SELECT *
      2     FROM (SELECT '北京' PROVINCE_NAME,'xuser1' OWNER_NAME,1 PERSON_NUM FROM DUAL)
      3     FULL JOIN
      4          (SELECT '安徽' PROVINCE_NAME,'黄某某' MODIFY_NAME,2 PERSON_NUM1 FROM DUAL)
      5     ON OWNER_NAME = MODIFY_NAME;PROVINCE_NAME OWNER_NAME PERSON_NUM PROVINCE_NAME MODIFY_NAME PERSON_NUM1
    ------------- ---------- ---------- ------------- ----------- -----------
    北京          xuser1              1                           
                                        安徽          黄某某                2SQL> 
      

  2.   

    你的这个需求应该是用union all,而不是full join:
    SELECT PROVINCE_NAME, OWNER_NAME, COUNT(OWNER_NAME) AS PERSON_NUM,'create' TYPE1
      FROM ADS.PERSON_INFO A
     WHERE 1 = 1
       AND TRUNC(CREATE_TIME) >= TO_DATE('2008-09-01', 'yyyy-mm-dd')
       AND TRUNC(CREATE_TIME) <= TO_DATE('2008-09-22', 'yyyy-mm-dd')
     GROUP BY PROVINCE_NAME, OWNER_NAME
    UNION ALL
    SELECT PROVINCE_NAME, MODIFY_NAME, COUNT(MODIFY_NAME) AS PERSON_NUM1,'modify' TYPE1
      FROM ADS.PERSON_INFO B
     WHERE 1 = 1
       AND MODIFY_TIME > CREATE_TIME
       AND TRUNC(MODIFY_TIME) >= TO_DATE('2008-09-01', 'yyyy-mm-dd')
       AND TRUNC(MODIFY_TIME) <= TO_DATE('2008-09-22', 'yyyy-mm-dd')
     GROUP BY PROVINCE_NAME, MODIFY_NAME;
      

  3.   

    单独查询黄某某是有数据的.但是联合一查就是空.没有值
    单独查:创建省市   用户名  创建人员数量
    北京       xuser1    1修改省市  用户名   修改人员数量
    安徽       黄某某    1但是full join 后就变成了创建省市  修改省市  用户名  创建人员数量  修改人员数量
    北京                 xuser1   1
              安徽       黄某某  如果我把那些日期的条件去掉,就可以查出来.
    创建省市  修改省市  用户名  创建人员数量  修改人员数量
    北京                 xuser1   1
              安徽       黄某某                   1  
      

  4.   

    我最后查出来的结果是要求这种格式的:省市  用户名  创建人数   修改人数.
    .
    .
    小计
    总计
    用union all 能查出这种效果吗
      

  5.   

    好的.
    表结构很简单person_id ,person_name,owner_name,modify_name,province_name,create_time,         modify_time
    1           aa            u1        u2          北京    2008-09-02 12:09:01  2008-09-02 12:09:01
    2           bb            u2         u2         安徽    2008-09-02 12:09:01  2008-09-12 12:09:01
    3           cc            u3         u1         河北    2008-09-02 12:09:01  2008-09-15 12:09:01
    要查询出的结果是这样 
    province_name  owner_name(modify_name)  create_num  modify_num安徽             u2                        1             1
    北京             u2                        0             1
    北京             u1                        1             0
    河北             u3                        1             0查询条件为省市和日期
      

  6.   

    补充一下:
    要查询出的结果是这样 
    province_name  owner_name(modify_name)  create_num  modify_num 安徽               u2                        1            1 
    小计                                             1            1
    北京               u2                        0            1 
    北京               u1                        1            0 
    小计                                             1            1
    河北               u3                        1            0 
    小计                                             1            0
    总计                                             3             2查询条件为省市和日期 
      

  7.   

    小计总计那些我知道怎么查.
    现在关键就是卡在full join那块.
    为什么单独查询都可以,但是联合后
    数据就错了呢.
    我看了个帖子,说oracle的full join查询有bug,是么?
      

  8.   

    河北就一条记录,怎么owner_name,modify_name不同?
      

  9.   

    LZ这个create_num和modify_num是什么意思?
    为什么北京的create_time和modify_time完全相同,但有两条记录。
    而河北的create_time和modify_time不一样,owner_name和modify_name也不一样。但modify_num=0?
      

  10.   

    汗一个.楼上看的可真仔细.第一条记录的时间确实是有点问题.modify_time应该改为稍后的日期.最终的意思就是根据省市.人员分组,按照时间查出创建的人数和修改的人数.create_num和modify_num分别指改用户创建的数量和修改的数量
      

  11.   

    我想了下,用UNION写比较容易,但是要扫描4次。不知道有没有好方法?
    OPER@tl>select * from test; PERSON_ID PERSON_NAM OWNER_NAME MODIFY_NAM PROVINCE_N CREATE_TIME         MODIFY_TIME
    ---------- ---------- ---------- ---------- ---------- ------------------- -------------------
             1 aa         u1         u2         北京       2008-09-02 12:09:01 2008-09-12 12:09:01
             2 bb         u2         u2         安徽       2008-09-02 12:09:01 2008-09-12 12:09:01
             3 cc         u3         u1         河北       2008-09-02 12:09:01 2008-09-15 12:09:01
             4 dd         u4         u4         四川       2008-09-02 12:09:01 2008-09-02 12:09:01OPER@tl>select nvl(province_name,'总计')province_name,nvl(owner_name,'小计')owner_name,
      2  sum(create_num)create_num,sum(modify_num)modify_num
      3  from
      4  (select province_name,owner_name,count(owner_name) create_num,0 as modify_num
      5  from test
      6  where create_time=modify_time
      7  group by province_name,owner_name
      8  union
      9  select province_name,owner_name,count(owner_name) create_num,0 as modify_num
     10  from test
     11  where create_time<>modify_time
     12  and owner_name<>modify_name
     13  group by province_name,owner_name
     14  union
     15  select province_name,modify_name,0 as create_num,count(modify_name) modify_num
     16  from test
     17  where create_time<>modify_time
     18  and owner_name<>modify_name
     19  group by province_name,modify_name
     20  union
     21  select province_name,owner_name,count(owner_name) create_num,count(modify_name) modify_num
     22  from test
     23  where create_time<>modify_time
     24  and owner_name=modify_name
     25  group by province_name,owner_name)
     26  group by rollup(province_name,owner_name)
     27  /PROVINCE_N OWNER_NAME CREATE_NUM MODIFY_NUM
    ---------- ---------- ---------- ----------
    安徽       u2                  1          1
    安徽       小计                   1          1
    北京       u1                  1          0
    北京       u2                  0          1
    北京       小计                   1          1
    河北       u1                  0          1
    河北       u3                  1          0
    河北       小计                   1          1
    四川       u4                  1          0
    四川       小计                   1          0
    总计       小计                   4          3已选择11行。OPER@tl>
      

  12.   

    谢谢vc555
     我试试.用union会不会速度很慢啊.