oracle统计(当前层级以及所有下级组织机构登录次数总和)
2016-07-06 10:16
537 查看
有两张表,一张组织机构表(存父级与子级组织机构关系),一张登录统计表(存组织机构登录日志),表结构如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/409c1eb62fc960d99a01f114efbd7161)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/e35b1e1624da6bc63972812f85c579bc)
因用户登录时统计登录日志只有当前组织机构的登录信息,没有被包含在父级登录信息中,而需求为统计父级登录次数时要把当前组织机构以及下属所有组织机构的登录次数加起来(选定时间段内、可以指定多个组织机构)。
====================================================================================================================================
函数(参数:组织机构ID、开始日期、结束日期):
CREATE OR REPLACE FUNCTION "getT" (orId IN VARCHAR2, ts IN VARCHAR2, te IN VARCHAR2)
RETURN NUMBER
IS
temp NUMBER;
BEGIN
select ti into temp from (select
sum(case when lg.id is null then 0 else 1 end) as ti
from
(
select ll.orgid from TBL_ORGM_ORG@PORTAL_TO_ASM ll start with ll.orgid=orId connect by prior ll.orgid=ll.PARENTORGID
)ids
left join TBL_LOGON_VISIT lg on ids.orgid = lg.orgid
where TO_CHAR (lg.visittime, 'yyyy-mm-dd') BETWEEN ts AND te
);
RETURN (temp);
END;
====================================================================================================================================
调用函数SQL:
select mm.orgid,
(select "getT"(mm.orgid,'2016-05-31','2016-06-30') from dual) as tim
from TBL_ORGM_ORG@PORTAL_TO_ASM mm
where mm.orgid in('10010000','32500050')
====================================================================================================================================
查询结果如下图:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/906d3a2d08b51a1245ccdf0b1afcc05e)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/ea6fd0120807138954017527baa9c5c5)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/a29c41978071bb2aec167e55b7bbc714)
![](https://oscdn.geek-share.com/Uploads/Images/Content/201607/2c3a1cf62f152d5dfc50aa02155ca54c)
====================================================================================================================================
注释:如果两个表不在一个数据库里,跨库可以建立database link(以上SQL里出现的@PORTAL_TO_ASM均为跨库连接)
建立database link的SQL如下:
--Create database link
create database link PORTAL_TO_ASM --要建立的database link名
connect to asm IDENTIFIED BY asm --访问用户名、密码
using '10.246.145.159/ipms'; --访问路径、数据库名
====================================================================================================================================
select ll.orgid from TBL_ORGM_ORG@PORTAL_TO_ASM ll start with ll.orgid='32500050' connect by prior ll.orgid=ll.parentorgid
等价于
select ll.orgid from TBL_ORGM_ORG@PORTAL_TO_ASM ll start with ll.parentorgid='32500050' connect by prior ll.orgid=ll.parentorgid
union
select ll.orgid from TBL_ORGM_ORG@PORTAL_TO_ASM ll where ll.orgid='32500050'
参考下图:
因用户登录时统计登录日志只有当前组织机构的登录信息,没有被包含在父级登录信息中,而需求为统计父级登录次数时要把当前组织机构以及下属所有组织机构的登录次数加起来(选定时间段内、可以指定多个组织机构)。
====================================================================================================================================
函数(参数:组织机构ID、开始日期、结束日期):
CREATE OR REPLACE FUNCTION "getT" (orId IN VARCHAR2, ts IN VARCHAR2, te IN VARCHAR2)
RETURN NUMBER
IS
temp NUMBER;
BEGIN
select ti into temp from (select
sum(case when lg.id is null then 0 else 1 end) as ti
from
(
select ll.orgid from TBL_ORGM_ORG@PORTAL_TO_ASM ll start with ll.orgid=orId connect by prior ll.orgid=ll.PARENTORGID
)ids
left join TBL_LOGON_VISIT lg on ids.orgid = lg.orgid
where TO_CHAR (lg.visittime, 'yyyy-mm-dd') BETWEEN ts AND te
);
RETURN (temp);
END;
====================================================================================================================================
调用函数SQL:
select mm.orgid,
(select "getT"(mm.orgid,'2016-05-31','2016-06-30') from dual) as tim
from TBL_ORGM_ORG@PORTAL_TO_ASM mm
where mm.orgid in('10010000','32500050')
====================================================================================================================================
查询结果如下图:
====================================================================================================================================
注释:如果两个表不在一个数据库里,跨库可以建立database link(以上SQL里出现的@PORTAL_TO_ASM均为跨库连接)
建立database link的SQL如下:
--Create database link
create database link PORTAL_TO_ASM --要建立的database link名
connect to asm IDENTIFIED BY asm --访问用户名、密码
using '10.246.145.159/ipms'; --访问路径、数据库名
====================================================================================================================================
select ll.orgid from TBL_ORGM_ORG@PORTAL_TO_ASM ll start with ll.orgid='32500050' connect by prior ll.orgid=ll.parentorgid
等价于
select ll.orgid from TBL_ORGM_ORG@PORTAL_TO_ASM ll start with ll.parentorgid='32500050' connect by prior ll.orgid=ll.parentorgid
union
select ll.orgid from TBL_ORGM_ORG@PORTAL_TO_ASM ll where ll.orgid='32500050'
参考下图:
相关文章推荐
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- Oracle Containers for J2EE远程安全漏洞(CVE-2014-0413)
- Oracle 10g R2不能使用EM的问题
- 表空间操作
- PreparedStatement中in子句的处理
- VMware下RedHat4.8_64位安装Oracle 10g RAC--简略脚本
- oracle sql日期比较
- 基于 Red Hat 的发行版 Oracle Linux 正式发布Oracle Linux 7.1
- OS block size和Oracle block size,查找OS Blocksize的方法
- gitinspector+jenkins 开发代码统计CI
- oracle中创建数据库和表空间的几点总结
- 数据库自动备份脚本
- oracle的nvl函数的使用介绍
- 解决oracle用户连接失败的解决方法
- oracle的一些tips技巧
- Oracle 下的开发日积月累
- Oracle存储过程之数据库中获取数据实例
- Windows下ORACLE 10g完全卸载的方法分析
- Oracle 函数大全[字符串函数,数学函数,日期函数]第1/4页