SQL运用full join连接,decode函数,nvl函数进行列转行
背景说明:
full join连接,decode函数,nvl函数,结合生产背景理解更深刻:
test_A表是现金业主某时间段的收益;test_B表是非现金业主某时间段的收益;对于业主,test_A表与test_B表的业主有交集。
现要求,求某天所有业主的各自收益。
表说明:
test_A是现金业主收益表,test_B是非现金业主收益表。v_member是业主编号,v_date是某时间段,v_mount是收益。
思路整理:
①先筛选满足某天'2020-09-24 00:00:00'的数据
test_A 满足条件V_DATE=TO_DATE('2020-09-24 00:00:00','YYYY-MM-DD HH24:MI:SS')的数据,
test_B 满足条件V_DATE=TO_DATE('2020-09-24 00:00:00','YYYY-MM-DD HH24:MI:SS')的数据.
②将"两个表满足条件的记录"都展示出来
selet * from (满足条件test_A)A full join (满足条件test_B) on A.v_member=A.v_member
③对结果集进行列转行处理
在列转行时,对于空值采用decode,nvl处理。
1、准备测试环境

1、准备测试环境 create table test_A(v_member number,v_date date,v_mount number);
create table test_B(v_member number,v_date date,v_mount number); insert into test_A
select rownum,to_date(trunc(dbms_random.value(to_number(to_char(sysdate-5,'J')),to_number(to_char(sysdate,'J')))),'J'),floor(dbms_random.value(0,100)) from dual connect by rownum<10; insert into test_B
select rownum+4,to_date(trunc(dbms_random.value(to_number(to_char(sysdate-5,'J')),to_number(to_char(sysdate,'J')))),'J'),floor(dbms_random.value(0,100)) from dual connect by rownum<10; test_A收益表,记录展示如下:
select * from test_A;
V_MEMBER V_DATE V_MOUNT
-------- ------------------- -------
1 2020-09-23 00:00:00 26
2 2020-09-27 00:00:00 87
3 2020-09-25 00:00:00 33
4 2020-09-24 00:00:00 20
5 2020-09-24 00:00:00 70
6 2020-09-23 00:00:00 51
7 2020-09-24 00:00:00 16
8 2020-09-26 00:00:00 65
9 2020-09-23 00:00:00 95 test_B收益表,记录展示如下:
select * from test_B;
V_MEMBER V_DATE V_MOUNT
-------- ------------------- -------
5 2020-09-24 00:00:00 26
6 2020-09-27 00:00:00 41
7 2020-09-23 00:00:00 35
8 2020-09-25 00:00:00 12
9 2020-09-25 00:00:00 57
10 2020-09-25 00:00:00 10
11 2020-09-24 00:00:00 47
12 2020-09-23 00:00:00 5
13 2020-09-27 00:00:00 18
2、将满足条件的记录展示出来
select A.*,B.* from
(
select * from TEST_A where V_DATE=TO_DATE('2020-09-24 00:00:00','YYYY-MM-DD HH24:MI:SS')
)A full JOIN
(
select * from TEST_B where V_DATE=TO_DATE('2020-09-24 00:00:00','YYYY-MM-DD HH24:MI:SS')
)B
on A.V_MEMBER=B.V_MEMBER V_MEMBER V_DATE V_MOUNT V_MEMBER V_DATE V_MOUNT
-------- ------------------- ------- -------- ------------------- -------
4 2020-09-24 00:00:00 20 (null) (null) (null)
5 2020-09-24 00:00:00 70 5 2020-09-24 00:00:00 26
7 2020-09-24 00:00:00 16 (null) (null) (null)
(null) (null) (null) 11 2020-09-24 00:00:00 47
说明:用full join将满足条件的记录都展示出来。
满足'2020-09-24 00:00:00'的test_A有业主4,5,7;满足'2020-09-24 00:00:00'的test_B有业主5,11;test_A与test_B两表同时间业主交集:5。
3、将列转成行,展示需要的记录
处理行列转行的思路:V_MEMBER,V_DATE哪个表的值不为null就取它,若同时不为null就取test_A的字段值。V_MOUNT谁的值不为null就取谁的值,若都不为null就取两表的累计值。
①采用decode函数
select decode(A.V_MEMBER,null,B.V_MEMBER,A.V_MEMBER) V_MEMBER,decode(A.V_Date,null,B.V_Date,a.V_Date) V_Date, decode(A.V_MOUNT,null,0,A.V_MOUNT)+decode(B.V_MOUNT,NULL,0,B.V_MOUNT) Amount
from
(
select * from TEST_A where V_DATE=TO_DATE('2020-09-24 00:00:00','YYYY-MM-DD HH24:MI:SS')
)A full JOIN
(
select * from TEST_B where V_DATE=TO_DATE('2020-09-24 00:00:00','YYYY-MM-DD HH24:MI:SS')
)B
on A.V_MEMBER=B.V_MEMBER ②采用nvl函数
select nvl(A.V_MEMBER,B.V_MEMBER) V_MEMBER,nvl(A.V_Date,B.V_Date) V_Date, nvl(A.V_MOUNT,0)+nvl(B.V_MOUNT,0) Amount
from
(
select * from TEST_A where V_DATE=TO_DATE('2020-09-24 00:00:00','YYYY-MM-DD HH24:MI:SS')
)A full JOIN
(
select * from TEST_B where V_DATE=TO_DATE('2020-09-24 00:00:00','YYYY-MM-DD HH24:MI:SS')
)B
on A.V_MEMBER=B.V_MEMBER
/******************查询结果展示******************/
V_MEMBER V_DATE AMOUNT
-------- ------------------- ------
4 2020-09-24 00:00:00 20
5 2020-09-24 00:00:00 96
7 2020-09-24 00:00:00 16
11 2020-09-24 00:00:00 47
注意:业主5在'2020-09-24 00:00:00'的收益是有test_A与test_B共同贡献的。
至此,所有业主在某天的各自收益已经汇总出来。
其他问题请关注目录:https://www.cnblogs.com/handhead/
SQL运用full join连接,decode函数,nvl函数进行列转行的更多相关文章
- sql的各种join连接
SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- ...
- SQL中的join连接查询
inner join(交集 ,自然连接, 简写成join) 是最普通的连接查询,相当于早期根据where条件连接的查询 outer join(并集或部分并集,左表 + 右表) le ...
- SQL Server将查询出数据进行列转行操作
在日常的SQL Server数据查询时经常会遇到需要将数据列转换成行的操作,现将自己学习的列转行SQL语句举例如下: --首先查询语句 SELCT * FROM YXBAK..TBYJKSTEMP ...
- 简单接触oracle数据库nvl函数decode函数
SQL语句的DECODE()和NVL()函数用法 SELECT DECODE(choose_tool,0,'宝马',1,'电动车',2,'自行车','步行') AS my_tool FROM dat ...
- nvl函数 oracle
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
- Oracle中的NVL函数
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
- Oracle的nvl函数和nvl2函数
一.基本语法 介绍一下oracle的nvl函数和nvl2函数. nvl函数 nvl函数基本语法为nvl(E1,E2),意思是E1为null就返回E2,不为null就返回E1. nvl2函数 nvl2函 ...
- 一起学Hive——总结各种Join连接的用法
Hive支持常用的SQL join语句,例如内连接.左外连接.右外连接以及HiVe独有的map端连接.其中map端连接是用于优化Hive连接查询的一个重要技巧. 在介绍各种连接之前,先准备好表和数据. ...
- [转载]Oracle中的NVL函数
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
- Oracel中的NVL函数
Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...
随机推荐
- 2023-06-20:给定一个长度为N的数组arr,arr[i]表示宝石的价值 你在某天遇到X价值的宝石, X价值如果是所有剩余宝石价值中的最小值,你会将该宝石送人 X价值如果不是所有剩余宝石价值中的
2023-06-20:给定一个长度为N的数组arr,arr[i]表示宝石的价值 你在某天遇到X价值的宝石, X价值如果是所有剩余宝石价值中的最小值,你会将该宝石送人 X价值如果不是所有剩余宝石价值中的 ...
- 3 分钟为英语学习神器 Anki 部署一个专属同步服务器
原文链接:https://icloudnative.io/posts/anki-sync-server/ Anki 介绍 Anki 是一个辅助记忆软件,其本质是一个卡片排序工具--即依据使用者对卡片上 ...
- .NET 8 Preview 6发布,支持新的了Blazor呈现方案 和 VS Code .NET MAUI 扩展
2023年7月11日 .NET 8 Preview 6,.NET 团队在官方博客发布了系列文章: Announcing .NET 8 Preview 6[1] ASP.NET Core updates ...
- Nginx使用Lua脚本加解密RSA字符串
本文主要介绍使用Lua脚本对采用RSA加密后的字符串进行解密的过程. 使用第三方类库lua-resty-rsa,参考地址:https://github.com/spacewander/lua-rest ...
- EaselJS 源码分析系列--第一篇
什么是 EaselJS ? 事儿还得从 Flash 说起,因为我最早接触的就是 Flash, 从 Flash 入行编程的 Flash 最早的脚本是 Actionscript2.0 它的 1.0 我是没 ...
- 【转载】Linux虚拟化KVM-Qemu分析(九)之virtio设备
原文信息 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...
- 利用文件包含漏洞包含ssh日志拿shell
今天看文章学了一招,有包含漏洞无法传文件的时候用 目标服务器环境为ubuntu,ssh登录日志文件是/var/log/auth.log 找个Linux的环境执行ssh '<? phpinfo() ...
- K8S | Config应用配置
绕不开的Config配置: 一.背景 在自动化流程中,对于一个应用来说,从开发阶段的配置管理,到制作容器镜像,再到最后通过K8S集群发布为服务,整个过程涉及到的配置非常多: 应用环境:通常是指代码层面 ...
- AcWing 4798. 打怪兽题解
可以从 \(1\) 枚举到 \(n\) 表示要打多少个怪兽. 因为你要打 \(t\) 个怪兽,并不管顺序,所以我们可以对 \([1, t]\) 这一段进行排序,然后计算 \(a[t], a[t - 2 ...
- 论文解读(MCD)《Maximum Classifier Discrepancy for Unsupervised Domain Adaptation》
Note:[ wechat:Y466551 | 付费咨询,非诚勿扰 ] 论文信息 论文标题:Maximum Classifier Discrepancy for Unsupervised Domain ...