当前位置:文档之家› oracle中dual表的用途

oracle中dual表的用途

oracle中dual表的用途
oracle中dual表的用途

1、DUAL表的用途

Dual 是Oracle中的一个实际存在的表,任何用户均可读取,常用在没有目标表的Select语句块中

--查看当前连接用户

Connected to Oracle Database 10g Enterprise Edition Release 10.1.0.2.0

Connected as SYS

SQL> select user from dual;

USER

------------------------------

SYSTEM

--查看当前日期、时间

SQL> select systimestamp from dual;

SYSTIMESTAMP

--------------------------------------------------------------------------------

09-3月-11 11.11.05.901000 上午+08:00

SQL> select to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual; TO_CHAR(SYSDATE,'YYYY-MM-DDHH2

------------------------------

2011-03-09 11:12:03

--当作计算器用

SQL> select 1+2 from dual;

1+2

----------

3

--查看序列值

SQL> create sequence a increment by 1 start with 1;

Sequence created

SQL> select a.nextval from dual;

NEXTVAL

----------

1

SQL> select a.currval from dual;

CURRVAL

----------

1

SQL> drop sequence a;

Sequence dropped

2、关于DUAL表的测试与分析

DUAL就是个一行一列的表,如果你往里执行insert、delete、truncate 操作,就会导致很多程序出问题。结果也因sql*plus、pl/sql dev等工具而异。

--查看DUAL是什么OBJECT

--DUAL是属于SYS schema的一个表,然后以PUBLIC SYNONYM的方式供其他数据库USER使用.

先格式化列标题和列数据的现实格式:

SQL> clear columns;

SQL> COLUMN owner HEADING FORMAT a10

WORD_WRAPPEND

SQL> COLUMN object_name HEADING FORMAT a15 WORD_WRAPPEND

SQL> COLUMN object_type HEADING FORMAT a15 WORD_WRAPPEND

SQL> select owner,object_name,object_type from dba_objects where object_name like '%DUAL%';

OWNER OBJECT_NAME OBJECT_TYPE

---------- --------------- ---------------

SYS DUAL TABLE

PUBLIC DUAL SYNONYM

SQL> clear columns;

--查看表结构,只有一个字段DUMMY,为VARCHAR2(1)型

SQL> desc dual;

Name Type Nullable Default Comments

----- ----------- -------- ------- --------

DUMMY VARCHAR2(1) Y

--DUAL表的结构:

create table SYS.DUAL

(

DUMMY VARCHAR2(1)

)

tablespace SYSTEM

pctfree 10

pctused 40

initrans 1

maxtrans 255

storage

(

initial 16K

next 16K

minextents 1

maxextents 505

pctincrease 50

);

/*

很是困惑,ORACLE为什么要用VARCHAR2(1)型,用CHAR(1)难道不好么?从这样的表结构来看,DUAL表设计的目的就是要尽可能的简单,以减少检索的开销。

还有,DUAL表是建立在SYSTEM表空间的,第一是因为DUAL表是SYS这个用户建的,本来默认的表空间就是SYSTEM;第二,把这个可能经常被查询的表和用户表分开来存放,对于系统性能的是有

好处的。

有了创建了表、创建了同义词还是不够的。DUAL在SYS这个Schema 下面,因此用别的用户登录是无法查询这个表的,因此还需要授权:grant select on SYS.DUAL to PUBLIC with grant option;

将Select 权限授予公众。

接下来看看DUAL表中的数据,事实上,DUAL表中的数据和ORACLE 数据库环境有着十分重要的关系(ORACLE不会为此瘫痪,但是不少存储过程以及一些查询将无法被正确执行)。

*/

--查询行数

--在创建数据库之后,DUAL表中便已经被插入了一条记录。个人认为:DUMMY字段的值并没有什么关系,重要的是DUAL表中的记录数SQL> select count(*) from dual;

COUNT(*)

----------

1

SQL> select * from dual;

DUMMY

-----

X

--使用PL/SQL Developer插入数据,能现实所有的数据。

SQL> insert into dual values('Y');

1 row inserted

SQL> insert into dual values('X');

1 row inserted

SQL> insert into dual values('Z');

1 row inserted

SQL> commit;

Commit complete

SQL> select * from dual;

DUMMY

-----

X

Y

X

Z

但是当我们执行下面语句时只显示一行:

SQL> select sysdate from dual;

SYSDATE

-----------

2011-3-9 12

SQL> select systimestamp from dual;

SYSTIMESTAMP

--------------------------------------------------------------------------------

09-3月-11 12.10.23.073000 下午+08:00

当system用户用oracle SQL*Plus登录后,执行相同的操作,显示插入数据成功,但是查询不了添加的数据,统计也只有一条数据,查看表中的所有数据,也只能看到原表中的数据'X'.

--把表截掉

SQL> truncate table dual;

Table truncated

SQL> commit;

Commit complete

然而,数据表里还有一条数据没有被删除,这是表里至少要有一条数据的原因。

SQL> select count(*) from dual;

COUNT(*)

----------

1

SQL> select * from dual;

no rows selected

但是下面这个语句还能成功:

SQL> select sysdate from dual;

SYSDATE

-----------

2011-3-9 12

--试着把DUAL表中的数据删除,看看会出现什么结果:

SQL> delete from dual;

1 row deleted

SQL> select * from dual;

no rows selected

SQL> select sysdate from dual;

SYSDATE

-----------

09-3月-11

我们能取到系统日期。在以前的版本中是取不到系统日期的,据说原因是:sysdate是个函数,作用于每一个数据行。现在没有数据了,自然就不可能取出系统日期。但是10g版本中对此做了

修改,如果你对表中的数据进行全部删除,oracle也会保留一条空数

据在表中的,这样便于你用这个dual表进行其他操作。

--对于DELETE操作来说,ORACLE对DUAL表的操作做了一些内部处理,尽量保证DUAL表中只返回一条记录.当然这写内部操作是不可见的

--不管表内有多少记录(没有记录除外),ORACLE对于每次DELETE 操作都只删除了一条数据。

SQL> select count(*) from dual;

COUNT(*)

----------

4

SQL> delete from dual;

4 rows deleted

SQL> commit;

Commit complete

SQL> select count(*) from dual;

COUNT(*)

----------

1

附: ORACLE关于DUAL表不同寻常特性的解释

There is internalized code that makes this happen. Code checks that ensurethat a table scan of SYS.DUAL only returns one row. Svrmgrl behaviour is incorrect but this

is now an obsolete product.

The base issue you should always remember and keep is: DUAL table should always have 1 ROW. Dual is a normal table with one dummy column of varchar2(1).

This is basically used from several applications as a pseudo table for getting results from a select statement that use functions like sysdate or other

prebuilt or application functions. If DUAL has no rows at all some applications (that use DUAL) may fail with NO_DATA_FOUND exception. If DUAL has more than 1 row then

applications (that use DUAL) may fail with TOO_MANY_ROWS exception.

So DUAL should ALWAYS have 1 and only 1 row

DUAL表可以执行插入、更新、删除操作,还可以执行drop操作。但是不要去执行drop表的操作,否则会使系统不能用,数据库起不了,会报Database startup crashes with ORA-1092错误。

3、如果DUAL表被“不幸”删除后的恢复:

用sys用户登陆。

创建DUAL表。

授予公众SELECT权限(SQL如上述,但不要给UPDATE,INSERT,DELETE权限)。

向DUAL表插入一条记录(仅此一条):insert into dual values('X'); 提交修改。

--用sys用户登陆。

SQL> create pfile=?d:/pfile.bak? from spfile

SQL> shutdown immediate

--在d:/pfile.bak文件中最后加入一条:replication_dependency_tracking = FALSE

--重新启动数据库:

SQL> start up pfile=?d:/pfile.bak?

SQL> create table “sys”.”DUAL”

( “DUMMY” varchar2(1) )

pctfree 10 pctused 4;

SQL> insert into dual values(…X?);

SQL> commit;

SQL> Grant select on dual to Public;

授权成功。

SQL> select * from dual;

D

-

X

SQL> shutdown immediate

数据库已经关闭。

已经卸载数据库。

ORACLE 例程已经关闭。

SQL> startup

ORACLE 例程已经启动。

Total System Global Area 135338868 bytes

Fixed Size 453492 bytes

Variable Size 109051904 bytes

Database Buffers 25165824 bytes Redo Buffers 667648 bytes

数据库装载完毕。

数据库已经打开。

Excel中COUNTIF函数的使用方法汇总(新)

Excel中COUNTIF函数的使用方法汇总 一、求各种类型单元格的个数 (1) 求真空单元格单个数: =COUNTIF(data,"=") (2) 真空+假空单元格个数: =COUNTIF(data,"") 相当于countblank()函数 (3) 非真空单元格个数: =COUNTIF(data,"<>") 相当于counta()函数 (4) 文本型单元格个数: =COUNTIF(data,"*") 假空单元格也是文本型单元格 (5) 区域内所有单元格个数: =COUNTIF(data,"<>""") (6) 逻辑值为TRUE的单元格数量=COUNTIF(data,TRUE) 小说明: EXCEL单元格内数据主要有以下几类:数值型,文本型,逻辑型,错误值型。其中时间类型也是一种特殊的数值。文本类型的数字是文本型。 空单元格:指什么内容也没有的单元格,姑且称之为真空。 假空单元格:指0字符的空文本,一般是由网上下载来的或公式得来的,姑且称之为假空。 date指单元格区域,该参数不能是数组 二、求><=某个值的单元格个数 (1) 大于50 =COUNTIF(data,">50") (2) 等于50 =COUNTIF(data,50) (3) 小于50 =COUNTIF(data,"<50") (4) 大于或等于50 =COUNTIF(data,">=50") (5) 小于或等于50 =COUNTIF(data,"<=50") ¬

(6) 大于E5单元格的值=COUNTIF(data,">"&$E$5) (7) 等于E5单元格的值=COUNTIF(data,$E$5) (8) 小于E5单元格的值=COUNTIF(data,"<"&$E$5) (9) 大于或等于E5单元格的值=COUNTIF(data,">="&$E$5) (10) 小于或等于E5单元格的值=COUNTIF(data,"<="&$E$5) 三、等于或包含某N个特定字符的单元格个数 (1) 两个字符=COUNTIF(data,"??") (2) 两个字符并且第2个是B =COUNTIF(data,"?B") (3) 包含B =COUNTIF(data,"*B*") (4) 第2个字符是B =COUNTIF(data,"?B*") (5) 等于“你好”=COUNTIF(data,"你好") (6) 包含D3单元格的内容=COUNTIF(data,"*"&D3&"*") (7) 第2字是D3单元格的内容=COUNTIF(data,"?"&D3&"*") 注:countif()函数对英文字母不区分大小写,通配符只对文本有效 四、两个条件求个数 (1) >10并且<=15 =SUM(COUNTIF(data,">"&{10,15})*{1,-1}) (2) >=10并且<15 =SUM(COUNTIF(data,">="&{10,15})*{1,-1}) (3) >=10并且<=15 =SUM(COUNTIF(data,{">=10",">15"})*{1,-1}) (4) >10并且<15 =SUM(COUNTIF(data,{">10",">=15"})*{1,-1}) 注:一般多条件计数使用SUMPRODUCT函数,以上方法较少使用,仅供参考。补充:三个区域计数:

Oracle中分析函数用法小结

Oracle中分析函数用法小结 一.分析函数适用场景: ○1需要对同样的数据进行不同级别的聚合操作 ○2需要在表内将多条数据和同一条数据进行多次的比较 ○3需要在排序完的结果集上进行额外的过滤操作 二.分析函数语法: FUNCTION_NAME(,...) OVER () 例: sum(sal) over (partition by deptno order by ename) new_alias sum就是函数名 (sal)是分析函数的参数,每个函数有0~3个参数,参数可以是表达式,例如:sum(sal+comm) over 是一个关键字,用于标识分析函数,否则查询分析器不能区别sum()聚集函数和sum()分析函数 partition by deptno 是可选的分区子句,如果不存在任何分区子句,则全部的结果集可看作一个单一的大区 order by ename 是可选的order by 子句,有些函数需要它,有些则不需要.依靠已排序数据的那些函数,如:用于访问结果集中前一行和后一行的LAG和LEAD,必须使用,其它函数,如AVG,则不需要.在使用了任何排序的开窗函数时,该子句是强制性的,它指定了在计算分析函数时一组内的数据是如何排序的. 1)FUNCTION子句 ORACLE提供了26个分析函数,按功能分5类 分析函数分类 等级(ranking)函数:用于寻找前N种查询 开窗(windowing)函数:用于计算不同的累计,如SUM,COUNT,AVG,MIN,MAX等,作用于数据的一个窗口上 例: sum(t.sal) over (order by t.deptno,t.ename) running_total, sum(t.sal) over (partition by t.deptno order by t.ename) department_total 制表(reporting)函数:与开窗函数同名,作用于一个分区或一组上的所有列 例: sum(t.sal) over () running_total2, sum(t.sal) over (partition by t.deptno) department_total2 制表函数与开窗函数的关键不同之处在于OVER语句上缺少一个ORDER BY子句! LAG,LEAD函数:这类函数允许在结果集中向前或向后检索值,为了避免数据的自连接,它们是非常有用的. VAR_POP,VAR_SAMP,STDEV_POPE及线性的衰减函数:计算任何未排序分区的统计值 2)PARTITION子句 按照表达式分区(就是分组),如果省略了分区子句,则全部的结果集被看作是一个单一的组 3)ORDER BY子句

countif函数的使用方法汇总

countif函数的使用方法汇总 一、求各种类型单元格的个数 (1) 求真空单元格单个数: =COUNTIF(data,"=") (2) 真空+假空单元格个数: =COUNTIF(data,"") 相当于countblank()函数 (3) 非真空单元格个数: =COUNTIF(data,"<>") 相当于counta()函数 (4) 文本型单元格个数: =COUNTIF(data,"*") 假空单元格也是文本型单元格 (5) 区域内所有单元格个数: =COUNTIF(data,"<>""") (6) 逻辑值为TRUE的单元格数量=COUNTIF(data,TRUE) 小说明: EXCEL单元格内数据主要有以下几类:数值型,文本型,逻辑型,错误值型。其中时间类型也是一种特殊的数值。文本类型的数字是文本型。 空单元格:指什么内容也没有的单元格,姑且称之为真空。 假空单元格:指0字符的空文本,一般是由网上下载来的或公式得来的,姑且称之为假空。 date指单元格区域,该参数不能是数组 二、求><=某个值的单元格个数 (1)大于50 =COUNTIF(data,">50") (2)等于50 =COUNTIF(data,50) (3)小于50 =COUNTIF(data,"<50") (4)大于或等于50 =COUNTIF(data,">=50") (5)小于或等于50 =COUNTIF(data,"<=50") ¬ (6)大于E5单元格的值=COUNTIF(data,">"&$E$5) (7)等于E5单元格的值=COUNTIF(data,$E$5) (8)小于E5单元格的值=COUNTIF(data,"<"&$E$5) (9)大于或等于E5单元格的值=COUNTIF(data,">="&$E$5) (10)小于或等于E5单元格的值=COUNTIF(data,"<="&$E$5) 三、等于或包含某N个特定字符的单元格个数 (1)两个字符=COUNTIF(data,"??") (2)两个字符并且第2个是B =COUNTIF(data,"?B") (3)包含B =COUNTIF(data,"*B*") (4)第2个字符是B =COUNTIF(data,"?B*") (5)等于“你好”=COUNTIF(data,"你好") (6)包含D3单元格的内容=COUNTIF(data,"*"&D3&"*") (7)第2字是D3单元格的内容=COUNTIF(data,"?"&D3&"*") 注:countif()函数对英文字母不区分大小写,通配符只对文本有效 四、两个条件求个数 (1) >10并且<=15 =SUM(COUNTIF(data,">"&{10,15})*{1,-1}) (2) >=10并且<15 =SUM(COUNTIF(data,">="&{10,15})*{1,-1}) (3) >=10并且<=15 =SUM(COUNTIF(data,{">=10",">15"})*{1,-1}) (4) >10并且<15 =SUM(COUNTIF(data,{">10",">=15"})*{1,-1}) 注:一般多条件计数使用SUMPRODUCT函数,以上方法较少使用,仅供参考。

Oracle 分析函数(Analytic Functions) 说明

Oracle 分析函数(Analytic Functions)说明一. Analytic Functions 说明 分析函数是oracle 8中引入的一个概念,为我们分析数据提供了一种简单高效的处理方式. 官方对分析函数的说明如下: Analytic functions compute an aggregate value based on a group of rows. They differ from aggregate functions in that they return multiple rows for each group. The groupof rows is called a window and is defined bythe analytic_clause. For each row, a sliding window of rows is defined.The window determines the range of rows used to perform the calculations forthe current row. Window sizes can be based on either a physical number of rowsor a logical interval such as time. Analytic functions are the last set of operations performed in a query except for thefinal ORDER BY clause. All joins and all WHERE, GROUP BY,and HAVING clauses are completed before the analytic functions areprocessed. Therefore, analytic functions can appear only in the select listor ORDER BY clause. Analytic functions are commonly used to compute cumulative, moving, centered, andreporting aggregates. From:Analytic Functions https://www.doczj.com/doc/d418029059.html,/cd/E11882_01/server.112/e26088/functions004.htm#S QLRF06174 分析函数是对一组查询结果进行运算,然后获得结果,从这个意义上,分析函数非常类似于聚合函数(Aggregate Function)。区别是在调用分析函数时,后面加上了开窗子句over()。 聚合函数是对一个查询结果中的每个分组进行运算,并且对每个分组产生一个运算结果。分析函数也是对一个查询结果中的每个分组进行运算,但每个分组对应的结果可以有多个。产生这个不同的原因是分析函数中有一个窗口的概念,一个窗口对应于一个分组中的若干行,分析函数每次对一个窗口进行运算。运算时窗口在查询结果或分组中从顶到底移动,对每一行数据生成一个窗口。 Oracle 聚合函数(Aggregate Functions)说明 https://www.doczj.com/doc/d418029059.html,/tianlesoftware/article/details/7057249

电子表格Excel里COUNTIF函数常规用法

电子表格Excel里COUNTIF函数常规用法 (ZSA整编) 一、求各种类型单元格的个数 (1) 求真空单元格单个数: =COUNTIF(data,"=") (2) 真空+假空单元格个数: =COUNTIF(data,"") 相当于countblank()函数 (3) 非真空单元格个数: =COUNTIF(data,"<>") 相当于counta()函数 (4) 文本型单元格个数: =COUNTIF(data,"*") 假空单元格也是文本型单元格 (5) 区域内所有单元格个数: =COUNTIF(data,"<>""") (6) 逻辑值为TRUE的单元格数量 =COUNTIF(data,TRUE) 小说明: EXCEL单元格内数据主要有以下几类:数值型,文本型,逻辑型,错误值型。其中时间类型也是一种特殊的数值。文本类型的数字是文本型。 空单元格:指什么内容也没有的单元格,姑且称之为真空。 假空单元格:指0字符的空文本,一般是由网上下载来的或公式得来的,姑且称之为假空。 date指单元格区域,该参数不能是数组 二、求><=某个值的单元格个数 (1) 大于50 =COUNTIF(data,">50") (2) 等于50 =COUNTIF(data,50) (3) 小于50 =COUNTIF(data,"<50") (4) 大于或等于50 =COUNTIF(data,">=50")

(5) 小于或等于50 =COUNTIF(data,"<=50") (6) 大于E5单元格的值 =COUNTIF(data,">"&$E$5) (7) 等于E5单元格的值 =COUNTIF(data,$E$5) (8) 小于E5单元格的值 =COUNTIF(data,"<"&$E$5) (9) 大于或等于E5单元格的值 =COUNTIF(data,">="&$E$5) (10) 小于或等于E5单元格的值 =COUNTIF(data,"<="&$E$5) 三、等于或包含某N个特定字符的单元格个数 (1) 两个字符 =COUNTIF(data,"??") (2) 两个字符并且第2个是B =COUNTIF(data,"?B") (3) 包含 B =COUNTIF(data,"*B*") (4) 第2个字符是B =COUNTIF(data,"?B*") (5) 等于“你好” =COUNTIF(data,"你好") (6) 包含D3单元格的内容 =COUNTIF(data,"*"&D3&"*") (7) 第2字是D3单元格的内容 =COUNTIF(data,"?"&D3&"*") 注:countif()函数对英文字母不区分大小写,通配符只对文本有效 四、两个条件求个数 (1) >10并且<=15 =SUM(COUNTIF(data,">"&{10,15})*{1,-1}) (2) >=10并且<15 =SUM(COUNTIF(data,">="&{10,15})*{1,-1}) (3) >=10并且<=15 =SUM(COUNTIF(data,{">=10",">15"})*{1,-1}) (4) >10并且<15 =SUM(COUNTIF(data,{">10",">=15"})*{1,-1})

ORACLE排序与分析函数

--已知:两种排名方式(分区和不分区):使用和不使用partition --两种计算方式(连续,不连续),对应函数:dense_rank,rank 语法: rank()over(order by排序字段顺序) rank()over(partition by分组字段order by排序字段顺序) 1.顺序:asc|desc名次与业务相关: 示例:找求优秀学员:成绩:降序迟到次数:升序 2.分区字段:根据什么字段进行分区。 问题:分区与分组有什么区别? ·分区只是将原始数据进行名次排列(记录数不变), ·分组是对原始数据进行聚合统计(记录数变少,每组返回一条),注意:聚合。rank()与dense_rank():非连续排名与连续排名(都是简单排名) ·查询原始数据:学号,姓名,科目名,成绩 select*from t_score; S_ID S_NAME SUB_NAME SCORE 1张三语文80.00 2李四数学80.00 1张三数学0.00 2李四语文50.00 3张三丰语文10.00 3张三丰数学 3张三丰体育120.00 4杨过JAVA90.00 5mike c++80.00 3张三丰Oracle0.00 4杨过Oracle77.00 2李四Oracle77.00 ·查询各学生科目为Oracle排名(简单排名) select sc.s_id,sc.s_name,sub_name,sc.score,rank()over(order by score desc)名次from t_score sc where sub_name='Oracle'; S_ID S_NAME SUB_NAME SCORE名次 4杨过Oracle77.001 2李四Oracle77.001 3张三丰Oracle0.003 ·对比:rank()与dense_rank():非连续排名与连续排名(都是简单排名) S_ID S_NAME SUB_NAME SCORE名次

Oracle分析函数sum over介绍

分析函数sum over() 介绍 报送单位:审核人: 类型:业务应用 关键字:分析函数 1、引言 运维中,常常需要通过SQL语句对单行数据进行查询,同时又需要对结果集进行汇总,通常的方法是通过两个SQL语句分别进行查询汇总,这样效率低下。 2、现象描述 本节介绍一种ORACLE提供的全新的函数sum over(),该类函数称为分析函数,这类函数功能强大,可以通过一个SQL语句对数据进行遍历的同时又进行汇总,而且一张表只进行一次扫描,极大地提高SQL的执行效率。 3、处理过程 语法: FUNCTION_NAME(,,...) OVER() NAME:可以是SUM,AVG,MAX,MIN,COUNT等其它,这些函数单独使用称为聚集函数,与OVER子句一起使用使称为分析函数。在当分析函数使用时,SQL语句中不需要使用GROUP BY子句。

执行计划: 下图说明分析函数只对表进行一次扫描 4、举例说明 下面分别举例来说明分析函数的使用,原始数据如下表

示例1:查询单行数据同时对所有数据工资进行汇总求和 示例2:查询所有数据,同时对第各部门工资进行汇总,汇总范围取值为第一行所在部门至当前部门所有数据。

示例3:查询所有数据,并且每一行汇总值按ENAME排序后取第一行至当前行ENAME所在行。 示例4:查询所有数据,并且每一行汇总值按EMPNO排序后取第一行至当前行EMPNO所在行

示例5:查询所有数据,同时每行对各部门分别进行按EMPNO排序后从各组第一行至当前行汇总求和。 示例6:查询所有数据,同时每行对从当前上两行数据范围的工资进行汇总求和。 示例7:查询所有数据,同时每行对从当前向前一行数据向后两行数据范围的工资进行汇总求和。

countif函数用法

Excel中countif函数用法 2008-11-22 21:37 语法 COUNTIF(range,criteria) Range 为需要计算其中满足条件的单元格数目的单元格区域。 Criteria 为确定哪些单元格将被计算在内的条件,其形式可以为数字、表达式、单元格引用或文本。例如,条件可以表示为32、"32"、">32" 、"apples" 或B4。 说明 Microsoft Excel 还提供了其他一些函数,它们可根据条件来分析数据。 若要计算基于一个文本字符串或某范围内的一个数值的总和,可使用SUMIF 工作表函数。若要使公式返回两个基于条件的值之一,例如某指定销售金额的销售红利,可使用IF 工作表函数。若要计算空或非空单元格的个数,可使用COUNTA 和COUNTBLANK 函数。示例1:通用COUNTIF 公式如果您将示例复制到空白工作表中,可能会更易于理解该示例。 A B 1 数据数据 2 apples 32 3 oranges 54 4 peaches 75 5 apples 86 公式说明(结果) =COUNTIF(A2:A5,"apples") 计算第一列中苹果所在单元格的个数(2) =COUNTIF(A2:A5,A4) 计算第一列中桃所在单元格的个数(2) =COUNTIF(A2:A5,A3)+COUNTIF(A2:A5,A2) 计算第一列中柑桔和苹果所在单元格的个数(3) =COUNTIF(B2:B5,">55") 计算第二列中值大于55 的单元格个数(2) =COUNTIF(B2:B5,"<>"&B4) 计算第二列中值不等于75 的单元格个数(2) =COUNTIF(B2:B5,">=32")-COUNTIF(B2:B5,">85") 计算第二列中值大于或等于32 且小于或等于85 的单元格个数(3) 计算80到89之间的人数 =countif(B1:B10,">=80")-countif(B1:B10,">90") 假设B1:B10为你的数据区域. 2009-11-08 12:20 Excel中能熟练地掌握函数的技巧,在水文日常工作中能达到事半功倍的效果。例如:要计算A1:An(定义:data)区域中非零的单元格的平均值,可在单元格中输入=sum(data)/countif(data, "<>0")。下面具体介绍Countif()函数的高级技巧如下:

Count系列及Frequency函数应用技巧解读

Count函数及Frequency函数应用技巧解读! 在Excel中,如果要计数,一般情况下都使用Count系列,如Count函数,数值计数;Counta函数,非空单元格计数;Countblank函数,空单元格计数;Countif函数,单条件计数;Countifs:多条件计数。但在实际的应用中,还可以用Frequency 来计数,而且效率更高,更简单。 一、Count系列计数。 1、Count。 功能:计算区域中包含数字的单元格个数。 语法结构:=Count(值或单元格引用)。 目的:分季度统计商品的销售数。 方法: 在目标单元格中输入公式:=COUNT(C4:C10)。 解读: Count函数的参数对象为数值,及Count函数的统计结果为数值

类型的值,对其他类型的值无效! 2、Counta函数。 功能:计算区域中非空单元格的个数。 语法结构:=Counta(值或单元格引用)。 目的:计算非空单元格的个数。 方法: 在目标单元格中输入公式:=COUNTA(C4:C10)。 解读: 虽然Counta的统计结果和Count的结果相同,但Counta函数的统计对象是非空单元格。 3、Countblank函数。 功能:计算指定区域中空单元格的数量。 语法结构:=Countblank(值或单元格引用)。 目的:统计空单元格的个数。

方法: 在目标单元格中输入公式:=COUNTBLANK(C4:C10)。 4、Countif函数。 功能:计算指定区域中符合条件的单元格数。 语法结构:=Countif(条件范围,条件)。 目的:按“性别”统计单元格数。

方法: 在目标单元格中输入公式:=COUNTIF(C4:C10,K3)。 5、Countifs函数。 功能:统计一组规定条件下所指定的单元格数。 语法结构:=Countifs(条件1范围,条件1,条件2范围,条件2……条件N范围,条件N)。 目的:计算>60且<80的人数。

COUNTIF函数的使用方法(excel)

EXCEL中COUNTIF函数的使用方法 (2010-01-30 07:35:08) 转载 标签: 分类:Excel 单元格 a2 data 空文 个数 教育 1. 计算符合给定条件的区域中的非空单元格数 COSH 返回数的双曲线余弦...COUNTIF 计算符合给定条件的区域中的非空单元格数...DEGREES 将弧度转换为度 2. 工作表函数 返回参数的双曲余弦值...COUNTIF 工作表函数...计算给定区域内满足特定条件的单元格的数目 3. 假空单元格个数 案例296 统计真空、假空单元格个数(COUNTIF) 303... 4. 条件计数函数 条件计数函数COUNTIF...语法:COUNTIF(RANGE,CRTERIA) countif 函数是计算区域中满足给定条件的单元格的个数。 A B 1 数据数据 2 苹果 32 3 柑桔 54 4 桃 75 5 苹果 86

公式说明(结果) =COUNTIF(A2:A5,"apples") 计算第一列中苹果所在单元格的个数 (2) =COUNTIF(B2:B5,">55") 计算第二列中值大于 55 的单元格个数 (2) =countif(A:A,B1) 表示在A列中找出所有等与B1单元格内容的个数 COUNTIF函数常规用法 一、求各种类型单元格的个数 (1) 求真空单元格单个数: =COUNTIF(data,"=") (2) 真空+假空单元格个 数: =COUNTIF(data,"") 相当于countblank()函数 (3) 非真空单元格个 数: =COUNTIF(data,"<>") 相当于counta()函数 (4) 文本型单元格个 数: =COUNTIF(data,"*") 假空单元格也是文本型单元格 (5) 区域内所有单元格个数: =COUNTIF(data,"<>""") (6) 逻辑值为TRUE的单元格数量 =COUNTIF(data,TRUE) 小说明: EXCEL单元格内数据主要有以下几类:数值型,文本型,逻辑型,错误值型。其中时间类型也是一种特殊的数值。文本类型的数字是文本型。 空单元格:指什么内容也没有的单元格,姑且称之为真空。 假空单元格:指0字符的空文本,一般是由网上下载来的或公式得来的,姑且称之为假空。 date指单元格区域,该参数不能是数组 二、求><=某个值的单元格个数

Oracle分析函数

Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行。 一、开窗函数 开窗函数指定了分析函数工作的数据窗口大小,这个数据窗口大小可能会随着行的变化而变化。 例如: 1)over(order by salary)按照salary排序进行累计,order by是个默认的开窗函数 2)over(partition by department_id)按照部门分区 3)over(order by salary range between 50 preceding and 150 following) 每行对应的数据窗口是之前行幅度值不超过50,之后行幅度值不超过150 4)over(order by salary rows between 50 preceding and 150 following) 每行对应的数据窗口是之前50行,之后150行 5)over(order by salary rows between unbounded preceding and unbounded following) 每行对应的数据窗口是从第一行到最后一行,等效: 6) over(order by salary range between unbounded preceding and unbounded following) 其中: 第一行是unbounded preceding 当前行是current row 最后一行是unbounded following 二、分析函数的概念 分析函数是在整个SQL查询结束后(SQL语句中的ORDER BY的执行比较特殊)再进行的操作, 也就是说 SQL语句中的ORDER BY也会影响分析函数的执行结果。 分析函数中包含三个分析子句:分组(Partition By), 排序(Order By), 窗口(Window) 当省略窗口子句时: 1) 如果存在Order By则默认的窗口是unbounded preceding and current row 2) 如果同时省略Order By则默认的窗口是unbounded preceding and unbounded following 如果省略分组,则把全部记录当成一个组 a) 如果SQL语句中的Order By满足分析函数分析时要求的排序,那么SQL语句中的排序将先执行,分析 函数分析时就不必再排序 b) 如果SQL语句中的Order By不满足分析函数分析时要求的排序,那么SQL语句中的排序将最后在分 析函数分析结束后执行排序 三、分析函数 1)AVG

Oracle自定义聚合函数-分析函数

自定义聚合函数,分析函数 --from GTA Aaron 最近做一数据项目要用到连乘的功能,而Oracle数据库里没有这样的预定义聚合函数,当然利用数据库已有的函数进行数学运算也可以达到这个功能,如: selectexp(sum(ln(field_name))) from table_name; 不过今天的重点不是讲这个数学公式,而是如何自己创建聚合函数,实现自己想要的功能。很幸运Oracle 允许用户自定义聚合函数,提供了相关接口,LZ研究了下,留贴共享。 首先介绍聚合函数接口: 用户可以通过实现Oracle的Extensibility Framework中的ODCIAggregate interface 来创建自定义聚合函数,而且自定义的聚合函数跟内建的聚合函数用法上没有差别。 通过实现ODCIAggregaterountines来创建自定义的聚合函数。可以通过定义一个对象类型(Object Type),然后在这个类型内部实现ODCIAggregate 接口函数(routines),可以用任何一种Oracle支持的语言来实现这些接口函数,比如C/C++, JAVA, PL/SQL等。在这个Object Type定义之后,相应的接口函数也都在该Object Type Body内部实现之后,就可以通过CREATE FUNCTION语句来创建自定义的聚合函数了。 每个自定义的聚合函数需要实现4个ODCIAggregate 接口函数,这些函数定义了任何一个聚合函数内部需要实现的操作: 1. 自定义聚合函数初始化操作,从这儿开始一个聚合函数。初始化的聚合环境(aggregation context)会以对象实例(object type instance)传回给oracle. static function ODCIAggregateInitialize(varIN OUTagg_type ) return number 2. 自定义聚合函数,最主要的步骤,这个函数定义我们的聚合函数具体做什么操作,self 为 当前聚合函数的指针,用来与前面的计算结果进行关联。这个函数用来遍历需要处理的

oracle高级分析函数使用实例

oracle高级分析函数使用实例 2014年11月26日10:26:55 ?标签: ?oracle ?1744 ORACLE的分析函数,发现大家写SQL的时候有些功能写的比较麻烦或者不知道复杂的功能怎么通过SQL实现,ORACLE自带的分析函数有很多相应的功能: 它是Oracle分析函数专门针对类似于"经营总额"、"找出一组中的百分之多少" 或"计算排名前几位"等问题设计的。 分析函数运行效率高,使用方便。 分析函数是基于一组行来计算的。这不同于聚集函数且广泛应用于OLAP环境中。 Oracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是 对于每个组返回多行,而聚合函数对于每个组只返回一行。 语法: (,,...) over( ) 其中: 1 over是关键字,用于标识分析函数。 2 是指定的分析函数的名字。Oracle分析函数很多。 3 为参数,分析函数可以选取0-3个参数。 4 分区子句的格式为: partition by[,value_expr]... 关键字partition by子句根据由分区表达式的条件逻辑地将单个结果集分成N

组。这里的"分区partition"和"组group" 都是同义词。 5 排序子句order-by-clause指定数据是如何存在分区内的。其格式为:order[siblings]by{expr|position|c_alias}[asc|desc][nulls first|nulls last] 其中: (1)asc|desc:指定了排列顺序。 (2)nulls first|nulls last:指定了包含空值的返回行应出现在有序序列中的第一个或最后一个位置。 6窗口子句windowing-clause 给出一个固定的或变化的数据窗口方法,分析函数将对这些数据进行操作。在一组基于任意变化或固定的窗口中, 可用该子句让分析函数计算出它的值。 格式: {rows|range} {between {unbounded preceding|current row |{preceding|following} }and {unbounded preceding|current row |{preceding|following} }|{unbounded preceding|current row |{preceding|following }} (1)rows|range:此关键字定义了一个window。 (2)between...and...:为窗品指一个起点和终点。 (3)unbounded preceding:指明窗口是从分区(partition)的第一行开始。 (4)current row:指明窗口是从当前行开始。 create table emp( deptno varchar2(20),--部门编码 ename varchar2(20),--人名 sal number(10));--工资 insert into emp values('10','andy1',2000); insert into emp values('10','andy2',3000); insert into emp values('10','andy3',2000); insert into emp values('20','leno1',4000); insert into emp values('20','leno2',8000);

Oracle高级查询总结

高级查询总结 A.层次查询:start with……connec by prior…….. select lpad(' ',3*level)||ename,job,level from emp start with mgr is null connect by prior empno=mgr; 从根结点向下查,lpad()为左添加,level为第几层,prior为查找的方向;此句若省掉start with….则表示要遍历整个树型结构;若出现level,则后面一定要跟connect by B.交叉报表(case when then end 与decode()) select ename,case when sal>=1500then sal*1.01 else sal*1.1 end工资 from emp; select姓名, max(case课程when'语文'then分数end) 语文, max(case课程when'数学'then分数end) 数学, max(case课程when'历史'then分数end) 历史 from学生group by姓名;------(交叉报表与函数一起使用) select ename,sum(decode(sal,'sal',comm,null)) 奖金from emp group by ename;--可实现分支 decode(条件,(值),(返回值),…………,(默认值)) 部门 select sal,decode(sign(sal-1500),-1,1.1*sal,0,1.1*sal,1,1.05*sal) from emp; C.连接查询 1.等值: select * from emp,dept where emp.deptno(+)=dept.deptno; ‘+’在左则以右表为主,反之亦然 2.非等值:where的运算符不是等号 3.自然连接: select * from emp natural join dept 4.99乘法: select * from emp e full join dept d using (deptno) where deptno=10; --where必须放在using(on)的后面 D集合查询: 1.A Union B:消除重复行,有all则可以重复,默认第一列升序select ename,sal from deptno=20 union select ename,sal from job=’CLERK’; 2.A intersect B:A与B的交集 select ename,sal from deptno=20 intersect select ename,sal from job=’CLERK’; 3.A minus B:在A中减去既属于A又属于B的一部分

countif函数的使用方法

countif函数的使用方法统计文本的个数:=COUNTIF(F6:F22,"*") countif函数是使用频率最高的几个函数之一,下面针对这个函数做一个小小的专题.以方便大家学习,此文是本站原创。转载请注明转自“excel精英培训” 一、countif函数的用途 countif函数是根据条件在另一个区域进行个数的统计,一方面它可以完成符合条件的统计计算。另一方面由此扩展出它可以进行重复值的查找我表格的核对。 二、countif的基本语法: COUNTIF(单元格引用, 条件) 参数说明: 1 第一个参数只能是单元格引用方式,不能使用内存数组 2 第二个参数是条件,条件可以是值,可以是字符串构成的复合条件,可以使用通配符进行模糊统计,可以使用内存数组。 应用示例: 例1:统计在A列是“公司A”的个数 公式=Countif(A:A,"公司A") 例2:统计A列包含“公司A”的个数 公式=Countif(A:A,"*公司A*") 注:这里使用通配*表示字符前后有任意个字符。 例3:统计C列成绩大于60的学生个数 公式 =Countif(C:C,">60") 注:这里是用运算对比符号和数字构成的条件 例4:统计大于C1单元格数值的C列个数。 公式:=Countif(c:c,">" & c1)

注:这里是用&插入了一个变量,即C1的值。 例5:统计C列大于平均数的个数 公式:=Countif(c:c,">" & average(c:c)) 注:这里是使用了平均值函数average先计算平均值,然后作为条件。 例6:统计A列为“公司A”或“公司B”的个数 公式:{=Sum(Countif(A:A,{"公司A","公司B"})) } 注:这里在第二个参数里加入了常量数组,使用countif的结果是分别按两个公司名称统计的结果,也是一个数组假如是{3,4},得到数组后用sum函数对两个数进行求和,得到总的个数,这个公式是数组公式,所以一定要输入公式后把光标放在公式最后,按ctrl+shift,然后按enter键结束输入。 另:也许也还会问,如果设置更多条件该怎么弄,兰色幻想建议使用另一个可以多条件求和与计数的函数:sumproduct 例:统计大于1000,小于3000的数字个数 =sumprodcut((a1:a100>1000)*(a1:a100<3000)) 好了,关于countif函数就介绍到这里吧,希望能对大家有用。

Oracle 分析函数

--每一个值占总数的百分比 SELECT x, y, z,round(z/sum(z) over()*100,2)||'%' propn , sum(z) over() sum FROM t1; --每一个值占分组的百分比 SELECT x, y, z,round(z/sum(z) over(partition by x)*100,2)||'%' propn , sum(z) over(partition by x) sum FROM t1; --以x分区,按y排序累计取和 SELECT x, y, z, sum(z) over(partition by x order by y desc) sum FROM t1; --以x分区,按z降序,每个分区取前两个 select * from (select x, y, z, s, dense_rank() over(partition by x order by z desc) r1, rank() over(partition by x order by z desc) r2, count(*) over(partition by x order by z desc, y range unbounded preceding) r3 from (SELECT x, y, z, sum(z) over(partition by x) s FROM t1 order by 4 desc, z desc)) where r3 < 3 order by z desc, x /* 语法: function_name(,,...) over() 函数名(参数) over关键字( :over关键字用于区分普通聚集函数和分析函数,必选 partition子句:将结果集分区分组,当分区变化时重新计数 ORDER BY子句:数据在分区内是如何存储的,会直接影响一些分析函数 windowing子句:一个定义变化或固定的数据窗口方法,用于分析函数计数 range窗口:根据where条件将行集中到一起,如range 5 preceding,产生一个滑动窗口,在分区内拥有所有当前行以前的5行集合,只能用于数值和日期,order by只能有一列 order by sal range 1000 preceding row窗口:是物理单元,包括在窗口中的行的物理数 order by row 5 preceding 包含6行,当前行以及前面的5行,“前面”是指order by后的 ) */ select deptno, empno,

相关主题
文本预览
相关文档 最新文档