ORACLE统计函数的小知识

Group by 函数

在使用oracle进行sql统计的时候,需要对单个字段进行统计,但是统计的信息中需要将该表中的其他字段的信息也显示出来,但是只对需要的单一字段进行group by的话会出现 ORA-00979: 不是 GROUP BY 表达式 的报错信息。因为select 中出现的列必须全部出现在 group by 的后面

举个例子:
假设有一张商品product表,有id,category,pro_name,status。现在需要统计status为1的数据,并且需要按照category分类和显示所有列的信息。
错误示范:

1
select id,pro_name, count(status) as success from product where status = 1 group by category

因为group by 没有对id,pro_name等数据列进行分组,所以会出现ORA-00979: 不是 GROUP BY 表达式 的错误信息

正确操作:

1
select id,pro_name, count(status) as success from product where status = 1 group by category,id,pro_name

另外,如果需要对统计的数据进行保留两位小数这样的功能和把统计结果 中null 值设置为0,可以分别使用CASTNVL函数直接在SQL中进行处理。

CAST函数

CAST (expression AS data_type)

参数说明:

  1. expression:任何有效的SQServer表达式。
  2. AS:用于分隔两个参数,在AS之前的是要处理的数据,在AS之后是要转换的数据类型。
  3. data_type:目标系统所提供的数据类型,包括bigint和sql_variant,不能使用用户定义的数据类型。

所以可以用cast(value as number(10,2)来转换。如果通过CAST()函数将这个值转换为number类型,需要首先定义number值的精度与小数位数。这里的精度与小数位数分别为10与2,精度是总的数字位数,包括小数点左边和右边位数的总和。而小数位数是小数点右边的位数。这表示本例能够支持的最大的整数值是9999999,而最小的小数是0.01。

NVL函数

NVL(eExpression1, eExpression2)

参数解释:

如果eExpression1的计算结果为 null 值,则 NVL( ) 返回 eExpression2。如果eExpression1 的计算结果不是 null 值,则返回eExpression1


例如:
1
select id,pro_name, NVL(count(status),0) as success from product where status = 1 group by category,id,pro_name

ROUND函数

ROUND(number[,decimals])

参数解释:

number: 待做截取处理的数值
decimals: 指明需保留小数点后面的位数。可选项,忽略它则截去所有的小数部分,并四舍五入。如果为负数则表示从小数点开始左边的位数,相应整数数字用0填充,小数被去掉。另外如果number中的为整数,number将不会保留两位小数。所以需要保留两位小数还是使用CAST函数比较好


例如:ROUND(3.0,2])会被截取为3,而不会填充为3.00

0%