产品部门有一个分析需求,简化后是个组合问题,简单表述如下:

表结构

c4列表示状态,c1,c2,c3只要一个不为空,c4就为Y

现在想知道每个组合的情况

比如为什么组合(c1、c2)的值是2,因为只有2行(第1行、第3行)数据满足c1、c2都不为空

相关测试sql代码如下:

SQL> create table t (

2 id varchar2(1),

3 c1 int,

4 c2 int,

5 c3 int,

6 c4 varchar2(1)

7 );

Table created.

SQL> insert into t values ('a',1,1,null,'Y');

1 row created.

SQL> insert into t values ('b',null,1,1,'Y');

1 row created.

SQL> insert into t values ('c',1,1,1,'Y');

1 row created.

SQL> insert into t values ('d',1,null,null,'Y');

1 row created.

SQL> commit;

Commit complete.

SQL> select replace(path, '.*') path, count(1) cnt

2 from (select *

3 from (select (sys_connect_by_path(pivot_char, '.*')) Path

4 from (select regexp_substr(csv.csvdata, '[^,]+', 1, level) Pivot_char

5 from (select 'C1,C2,C3' as csvdata from dual) csv

6 connect by level <= 3)

7 connect by prior Pivot_char < Pivot_char

8 order by length(path), path) a,

9 (select nvl2(c1, 'C1', null) || nvl2(c2, 'C2', null) ||

10 nvl2(c3, 'C3', null) col_not_null

11 from t) b

12 where regexp_instr(b.col_not_null, a.path) > 0)

13 group by path

14 /

PATH CNT

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

C1 3

C2 3

C1C2 2

C2C3 2

C3 2

C1C3 1

C1C2C3 1

7 rows selected.

主要思路是构造所有可能的组合和表中实际数据关联匹配得出结果:

第一步:构造3行数据

SQL> select regexp_substr(csv.csvdata, '[^,]+', 1, level) Pivot_char

2 from (select 'C1,C2,C3' as csvdata from dual) csv

3 connect by level <= 3

4 /

PIVOT_CHAR

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

C1

C2

C3

第二步:3行数据所有组合情况,(.*)是为了后期正则匹配

SQL> select (sys_connect_by_path(pivot_char, '.*')) Path

2 from (select regexp_substr(csv.csvdata, '[^,]+', 1, level) Pivot_char

3 from (select 'C1,C2,C3' as csvdata from dual) csv

4 connect by level <= 3)

5 connect by prior Pivot_char < Pivot_char

6 order by length(path), path

7 /

PATH

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

.*C1

.*C2

.*C3

.*C1.*C2

.*C1.*C3

.*C2.*C3

.*C1.*C2.*C3

第三步:表中实际数据的组合情况

SQL> select nvl2(c1, 'C1', null) || nvl2(c2, 'C2', null) || nvl2(c3, 'C3', null) col_not_null

2 from t

3 /

COL_NOT_NULL

------

C1C2

C2C3

C1C2C3

C1

第四步:可能的7种组合和表中实际数据的组合情况关联匹配出结果,如(C1C2)可以匹配(C1)(C2)(C1C2)三种情况,最后结果如下

SQL> select replace(path, '.*') path, count(1) cnt

2 from (select *

3 from (select (sys_connect_by_path(pivot_char, '.*')) Path

4 from (select regexp_substr(csv.csvdata, '[^,]+', 1, level) Pivot_char

5 from (select 'C1,C2,C3' as csvdata from dual) csv

6 connect by level <= 3)

7 connect by prior Pivot_char < Pivot_char

8 order by length(path), path) a,

9 (select nvl2(c1, 'C1', null) || nvl2(c2, 'C2', null) ||

10 nvl2(c3, 'C3', null) col_not_null

11 from t) b

12 where regexp_instr(b.col_not_null, a.path) > 0)

13 group by path

14 /

PATH CNT

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

C1 3

C2 3

C1C2 2

C2C3 2

C3 2

C1C3 1

C1C2C3 1

7 rows selected.

第一篇文章...

Oracle查询排列组合,Oracle SQL排列组合之组合问题相关推荐

  1. oracle执行sql痕迹,Oracle 查询刚执行的SQL

    Oracle 查询刚刚执行的SQL select "SQL_TEXT", "SQL_FULLTEXT", "SQL_ID", "S ...

  2. oracle查看执行过的语句,oracle 查询执行过的SQL语句

    MySQL开启日志记录查询/执行过的SQL语句 作为后端开发者,遇到数据库问题的时候应该通过分析SQL语句来跟进问题所在,该方法可以记录所有的查询/执行的SQL语句到日志文件. 方法有几种,但是个人觉 ...

  3. oracle查询列取名,oracle查询列名

    oracle 动态列查询,,oracle查询列名,oracle查询动态sql oracle 动态查询列,查看oracle数据库的表名和列名,oracle查询列名,oracle查询列属性 oracle ...

  4. oracle查询结果添加序列,SQL查询结果增加序列号

    SQL查询记录中增加序列号 根据学生成绩在查询结果中增加排名字段: 1.SELECT ROW_NUMBER() OVER (ORDER BY SCORE ASC) AS RANK,NAME,SCORE ...

  5. oracle查询语句大全(oracle 基本命令大全一)

    来源:http://www.jb51.net/article/40467.htm 1.create user username identified by password;//建用户名和密码orac ...

  6. oracle 查询公有同义词,Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)

    一团网资讯 一团资讯 > oracle > Oracle序列(sequence),OracleRUNNUM和Oracle同义词(synonyms)... Oracle序列(sequence ...

  7. oracle 查询条件 if,oracle查询语句if

    oracle语句查询or和andSELECT*FROMPersonsWHERE(FirstName=' (FirstName='Thomas' OR FirstName='William') AND ...

  8. oracle 查询连接方法,Oracle 常用连接查询方法和函数

    Oracle常用的连接查询方法(以oracle自带的表做的练习),left join是以左表的记录为基础的,左表中的记录会全部显示,右表只显 一:Oracle常用的连接查询方法(以oracle自带的表 ...

  9. oracle查询flashback,【oracle】闪回flashback-10g-flashback query

    Flashback Query 1.说明 flashback是oracle9i开始提供的特性.在9i中利用oracle查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据对 ...

  10. oracle+查询主机地址,oracle函数:获取Internet主机名和ip地址

    您可能感兴趣的话题: Oracle 核心提示:oracle函数获取Internet主机名和ip地址 Oracle包utl_inaddr 作用:用于取得局域网或Internet环境中的主机名和IP地址. ...

最新文章

  1. apkplug利用plugin.xml传递自定义属性
  2. react-native init MyProject之后发生了什么
  3. c语言单元测验,C语言程序设计单元测验一.PDF
  4. .NETFramework-Web.Mvc:ViewResult
  5. SpringCloud创建Config多客户端公共配置
  6. python 获取当前月份月初日期和月末日期
  7. JPA还是JDBC?
  8. 大数据开发笔记(九):Flink综合学习
  9. tensorflow之pd模型
  10. centos7 mysql读写监控,《Centos7——zabbix监控mysql的常规操作》
  11. c语言立体爱心会跳动,c语言编程实例——小球跳动
  12. 软件推荐,强力卸载软件geek uninstaller
  13. 金士顿U盘写保护去除
  14. RS-232与RS485通信方式区别
  15. 【游戏】——微信打飞机
  16. 银行的压力测试如何进行?
  17. Matlab如何在一个窗口绘制多张子图
  18. Qt全局坐标和相对坐标
  19. 绿荫工作室爱选修app内测
  20. 解决单元测试时报Could not instantiate问题

热门文章

  1. SSM项目使用ConfigTools对数据库的密码进行加密
  2. Power query (Power BI)一步到位傻瓜式合并工作簿,史上最好用
  3. 利用python多个工作簿合并到一个工作簿
  4. 安装drupal9报错
  5. Ubuntu16.04使用语义分割标注工具Semantic-Segmentation-Editor
  6. 禾多科技与RTI达成合作,加速自动驾驶在中国量产落地
  7. Spring Boot 集成Spring Schedule定时任务执行功能(动态修改执行时间)
  8. java研发微博营销
  9. 植物大战僵尸:游戏中的“修改器【Python】”一定是作弊?善用增加趣味性!
  10. python模块导入详解