添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

oracle根据条件分组统计并行转列

根据数据库某个varchar2类型的字段是否包含和不包含某个字符串为查询条件,根据多列分组统计。
比如:数据库中有组织机构,漏洞级别(低、中、高),漏洞状态(已修复、未修复、接受风险),对组织机构分组,统计总数、漏洞的三个级别、漏洞的三个状态的数量,并列展示。

oracle判断某个字符串是否包含某个字符串的三种方法

如果实现上面的需求首先要添加查询条件,下面给出oracle判断某个字符串是否包含某个字符串的三种方法:

方法1:使用通配符%。

通配符也就是模糊匹配,适用于查询莫i个字符串中是否包含另一个模糊查询的场景。

select * from test where infoid like 'abc%'; 

方法2:使用contains函数。

oracle内置了一个contains函数用于判断某个字段是否包含某个字符串,第一个参数为要检索的字段,第二个参数为匹配的字符串。

select * from test where infoid contains (infoid,'abc');

但是,使用contains谓词有个条件,那就是列要建立索引,也就是说如果上面语句中test表的infoid列没有建立索引,那么就会报错,局限性比较大。

方法3:使用instr函数。

oracle内置了一个instr函数用于检索某个字段中某个字符串的位置,第一个参数为要从中检索的字符串,第二个参数为要检索的字符串,如果检索到了就返回首次检索到的位置(整数),检索不到则返回0。

select * from test where infoid instr(infoid,'abc')> 0;

这种方式较为灵活,其中重要的一点就是局限性较少,因此适用的场景比较多。

分组统计,行转列

使用case when函数,具体sql及效果如下:
在这里插入图片描述

前几天要做一个统计查询的功能,因为涉及多张表,多种条件统计分析。一开始便想到了UNION和IF语句,然后写了1000多行代码,就为了查30条数据觉得不应该。 然后就开始百度,多种条件下的统计。然后有一种语法让我眼前一亮,case when then else end 当满足CASE设定的条件时,就可以执行then语句。由于我要做的分组查询统计,是要罗列每一种情况,而且根据输入的“管理员编号”不同返回不同结果,结果记录的条数和每一种情况是可知的,这个语法完全可用 核心代码如下: SELECT SUBSTR(A.业务,1,2) 行政区域,SUBSTR(A.业务,3,LENGTH(A.业务 ③实现对报警信息(TYPENAME)内容分组统计,且获取最小开始时间(CreationTimeStart)、最大结束时间(CreationTime)差值(对差值保留2位小数). 分析函数over 及开窗函数一:分析函数overOracle从8.1.6开始提供分析函数,分析函数用于计算基于组的某种聚合值,它和聚合函数的不同之处是对于每个组返回多行,而聚合函数对于每个组只返回一行。下面通过几个例子来说明其应用。1:统计某商店的营业额。date sale1 202 153 144 185... 在Oracle中,可以使用多种方法来实现行转列和列转行。以下是一些常用的方法: PIVOT函数:Oracle 11g之后,支持使用PIVOT实现行转列。 MAX和DECODE函数:可以使用MAX函数结合DECODE函数来实现行转列。 CASE WHEN和GROUP BY:这种方式是最常用的,比较容易理解。 UNPIVOT函数:可以利用UNPIVOT()函数实现列转行。 UNION ALL方法:也可以使用UNION ALL方法来实现列转行。 在讲解具体的分组统计操作之前必须要先解决一个问题,什么情况下有可能分组? ·例如:全班,男生一组,女生一组,互相拔河; ·例如:全部,戴眼睛一组,不戴眼睛一组,互相比裸眼视力; ·例如:25 岁之前一组,25 岁之后一组,比年轻。 SELECT [DISTINCT] * | 列名称 [别名] , 列名称 [别名] ,... | 统计函数 -> 4、确定查询列 FROM 数据表 [别名] , 数据表 [别名] ,... ->1、数据来源 [WHERE 条件(s)] -> 2、过滤数据行