交叉连接(CROSS JOIN)的实际应用

一次偶然的机会,使用到了万年不用的交叉连接(CROSS JOIN)

业务场景如下:

1、存在多个运营商,每个运营商下面都有各种类型的设备,不同运营商的设备不完全相同;

2、任何设备有且仅有两种用途‘订购’、‘置换’

3、现在要统计发生了‘订购’、‘置换’操作运营商的订购数和置换数

思路:

先用交叉连接把所有存在订购和置换的运营商和设备组合查询出来(这里把运营商表和设备表交叉连接起来也是一样)

再过滤掉无数据的组合

各运营商各设备的订购数如图

各运营商各设备的置换数如图

统计结果如下

SQL如下(可直接运行)

WITH a AS(
SELECT 'o1' 运营商,'s1' 设备,'10' 订购数 FROM dual
UNION ALL
SELECT 'o1', 's2', '15' FROM dual
UNION ALL
SELECT 'o1', 's3', '20' FROM dual
UNION ALL
SELECT 'o2', 's1', '30' FROM dual
UNION ALL
SELECT 'o2', 's2', '35' FROM dual
),
b AS(
SELECT 'o1' 运营商,'s1' 设备,'10' 置换数 FROM dual
UNION ALL
SELECT 'o1', 's2', '15' FROM dual
UNION ALL
SELECT 'o2', 's4', '20' FROM dual
UNION ALL
SELECT 'o2', 's1', '30' FROM dual
UNION ALL
SELECT 'o4', 's2', '35' FROM dual
),
op AS(
SELECT a.运营商 FROM a
UNION
SELECT b.运营商 FROM b
),
sb AS(
SELECT a.设备 FROM a
UNION
SELECT b.设备 FROM b
),
opsb AS(
SELECT DISTINCT op.运营商,sb.设备 FROM op
CROSS JOIN sb)
SELECT opsb.运营商,opsb.设备,NVL(a.订购数,0) 订购数,NVL(b.置换数,0) 置换数 
FROM opsb
LEFT JOIN a ON a.运营商 = opsb.运营商 AND a.设备 = opsb.设备
LEFT JOIN b ON b.运营商 = opsb.运营商 AND b.设备 = opsb.设备
WHERE 订购数 IS NOT NULL 
OR 置换数 IS NOT NULL

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/273290.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C# xml文件读取与修改

c#读写xml文件已知有一个XML文件&#xff08;bookstore.xml&#xff09;如下&#xff1a; Code<?xml version"1.0" encoding"gb2312"?><bookstore> <book genre"fantasy" ISBN"2-3631-4"> <title>Obero…

外连接从表过滤

1、使用left join时从表的过滤 WITH a AS( SELECT A aid FROM dual UNION ALL SELECT B FROM dual UNION ALL SELECT C FROM dual UNION ALL SELECT D FROM dual UNION ALL SELECT E FROM dual ), b AS( SELECT A aid,10 num,1 type FROM dual UNION ALL SELECT B,20,2 FROM d…

ORACLE将查询字段指定为某种类型

SELECT CAST(张三 AS VARCHAR2(20)) name FROM dual; 一般来说在查询时很少有用到这种语句&#xff0c;但是使用CREATE TABLE ... AS SELECT ...语句的时候这个就很好用了 --建表 CREATE TABLE test01 AS SELECT 张三 name FROM dual; --正常插入数据 INSERT INTO test01 SEL…

分组查询最晚一条数据(ORACLE)

现有客户表&#xff0c;交费表&#xff0c;需查询每个存在交费记录客户的最后一笔交费信息 这里提供两种方式 注&#xff1a;客户不会在同一时间有两条交费&#xff0c;SQL可直接执行 --查询客户名称&#xff0c;最后一笔交费时间&#xff0c;以及最后一笔交费金额 WITH --客…

ORACLE循环中使用序列

在批量生成数据时&#xff0c;经常会用到序列的Nextval&#xff0c;今天碰到了这样的情况&#xff0c;日常记录&#xff0c;下附解决方案。先看这段脚本 DECLARE i INTEGER; BEGINFOR cur IN 1..5 LOOPi : DomainObjectId.Nextval;dbms_output.put_line(i);END LOOP; END; 编…

mysql001创建数据库

-- 注释&#xff0c;ctrl/ -- 查询所有数据库&#xff1b; show DATABASES; -- 创建数据库; CREATE DATABASE studb; -- 切换数据库; USE studb; -- 删除数据库 DROP DATABASE studb;

mysql002创建表

-- 创建student表 DDL CREATE TABLE stdent( sno int(3), name VARCHAR(55), sex CHAR(2), age int, dtdate date, classname VARCHAR(55), email VARCHAR(55) ) -- 查询表中数据 DQL SELECT * FROM stdent;

mysql003操作表DDL

-- 查询表中数据 DQL 注意在mydb数据库下面 SELECT * FROM stdent; -- 在表中添加一列 DDL -- 新增列 默认添加到最后 ALTER TABLE stdent add score DOUBLE(4,1); -- 新增一列 在表中开头添加 ALTER TABLE stdent add score2 double(5,1) first; -- 在指定列后面添…

mysql005约束.列级别

-- 列级约束 -- sno 主键&#xff1a;唯一&#xff0c;不为空&#xff0c;自增 -- name 非空 -- sex 非空&#xff0c;默认值&#xff0c;只有男女 -- age 0-30岁 -- score 非空 -- dtdate 非空 -- classname 非空 -- email唯一 -- 创建表&#xff0c;增加列级约束 …

hdu.1430.魔板(bfs + 康托展开)

魔板 Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2170 Accepted Submission(s): 455 Problem Description在魔方风靡全球之后不久&#xff0c;Rubik先生发明了它的简化版——魔板。魔板由8个同样大小的方…

mysql006添加外键约束

-- 添加外键 -- 建立主表&#xff0c;班级表 CREATE TABLE class( cno int PRIMARY key auto_increment, cname VARCHAR(55) ) SELECT * FROM class; -- 建立从表&#xff0c;学生表 CREATE table stu( sno int PRIMARY KEY auto_increment, sname VARCHAR(55), sex ch…

Circle-Progress-View

https://github.com/jakob-grabner/Circle-Progress-View 转载于:https://www.cnblogs.com/eustoma/p/4507476.html

elasticsearch 删除满足条件的语句_ELK从入门到还未精通(二)——ElasticSearch上篇

大家好&#xff0c;我是泥腿子安尼特&#xff0c;5个月没在李佬都公众号更新文章了。上一篇&#xff0c;大致介绍了作为工具人的我是如何基本使用这一套ELK 系统的。今天就讲讲这个最重要的E——基于Lucene的搜索引擎ElasticSearch(后面简称ES)。最近刚搬家&#xff0c;没想到隔…

mysql004操作表.增删改

-- 查询表中数据 DQL 注意在mydb数据库下面 SELECT * FROM stdent; -- 新增数据 这种写法数据的循序和数据库的字段循序保持一致。 INSERT INTO stdent values (1,"张三","男",25,"2021.1.1","java","123qq.com"); --…

纸板怎么切割光滑_激光切割机大PK!光纤、CO2、YAG,你选谁?!

问&#xff1a;我也是钣金人&#xff0c;怎么加入组织&#xff1f;答&#xff1a;点标题下方蓝字“钣金家园光纤激光切割机之所以能在市场快速站稳脚跟并且逐步替代传统切割工艺&#xff0c;是由于其在各方面独具优势&#xff0c;那么他到底优秀在哪里呢&#xff1f;我们把CO2激…

mysql007.算数运算.别名.去重.排序

-- 创建DEPT表 CREATE TABLE DEPT( DEPTNO int(2) not null, DNAME VARCHAR(14), LOC VARCHAR(13) ); -- 查询DEPT表 SELECT * FROM DEPT; -- 修改表&#xff0c;添加主键 ALTER TABLE DEPT add CONSTRAINT PK_DEPT PRIMARY KEY(DEPTNO); -- 查询表结构。 desc DEPT; …

c# 蓝牙虚拟串口_蓝牙模块——基础知识介绍

1. 数据透传蓝牙模块可以通过串口(SPI、IIC)和MCU控制设备进行数据传输。蓝牙模块可以做为主机和从机。主机就是能够搜索别的蓝牙模块并主动建立连接&#xff0c;从机则不能主动建立连接&#xff0c;只能等别人连接自己。2. 低功耗低功耗蓝牙(Bluetooth Low Energy)&#xff0c…

Error: could not open `C:\Java\jre7\lib\i386\jvm.cfg

打开eclipse时出现Error: could not open C:\Program Files\Java\jre7\lib\i586\jvm.cfg’) 删除 c:\windows\system32\java&#xff0c; c:\windows\system32\javaw&#xff0c; c:\windows\system32\javaws, 如果是64位系统&#xff0c;还要删除 c:\windows\SysWOW64\java&am…

java项目001.双色球游戏

package Suangseq; //双色球游戏制作。 import java.awt.SystemColor; import java.util.Arrays; import java.util.Scanner; public class TextA { public static void main(String[] args) { boolean flagfalse;//定义一个布尔类型的变量。 int[] mynull;//定义一个变量 in…

华为手机30s桌面循环滑动_华为发飙了!麒麟820+双模5G,从2699元跌至2499元,超出消费者预期...

阅读本文前&#xff0c;请您先点击上面的“蓝色字体”&#xff0c;再点击“关注”&#xff0c;这样您就可以继续免费收到文章了。每天都会有分享&#xff0c;都是免费订阅&#xff0c;请您放心关注。注图文来源网络&#xff0c;侵删 …