我现在有一个这样的统计需求.
人员表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
安徽 黄某某
黄用户的修改数量查不出来啊?请问如何解决这种问题啊?
人员表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
安徽 黄某某
黄用户的修改数量查不出来啊?请问如何解决这种问题啊?
解决方案 »
- 每个“*”代表100
- windows Server 2008 R2安装Oracle 11g出错
- oracle集群环境下的高级复制
- 对四个日期字段我想同时查处一年内在这四个出现的个数,和其和值
- 用数据集DS向Oracle表填充出错
- 在11g中。我解开了HR用户了。可是登录时还是提示:“应用程序要求的数据库权限超出了您当前具有的权限。有关特定版本的详细信息, 请单击“帮助”。”
- 问一个很简单的问题.(数据库的安装)
- Windows2003下创建Oracle数据库问题
- [高手请进]-关于数据库日志产生的几个问题
- java.sql.SQLException: 不允许的操作: operation cannot be mixed with Oracle-style batch
- 一个错误的解决方法
- 求一存储过程
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>
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;
单独查:创建省市 用户名 创建人员数量
北京 xuser1 1修改省市 用户名 修改人员数量
安徽 黄某某 1但是full join 后就变成了创建省市 修改省市 用户名 创建人员数量 修改人员数量
北京 xuser1 1
安徽 黄某某 如果我把那些日期的条件去掉,就可以查出来.
创建省市 修改省市 用户名 创建人员数量 修改人员数量
北京 xuser1 1
安徽 黄某某 1
.
.
小计
总计
用union all 能查出这种效果吗
表结构很简单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查询条件为省市和日期
要查询出的结果是这样
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查询条件为省市和日期
现在关键就是卡在full join那块.
为什么单独查询都可以,但是联合后
数据就错了呢.
我看了个帖子,说oracle的full join查询有bug,是么?
为什么北京的create_time和modify_time完全相同,但有两条记录。
而河北的create_time和modify_time不一样,owner_name和modify_name也不一样。但modify_num=0?
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>
我试试.用union会不会速度很慢啊.