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,这几个函数用在各个类型上都可以. 下面简 ...
随机推荐
- Vue3从入门到精通(二)
vue3 侦听器 在Vue3中,侦听器的使用方式与Vue2相同,可以使用watch选项或$watch方法来创建侦听器.不同之处在于,Vue3中取消了immediate选项,同时提供了新的选项和API. ...
- 一文搞懂V8引擎的垃圾回收机制
前言 我们平时在写代码的过程中,好像很少需要自己手动进行垃圾回收,那么V8是如何来减少内存占用,从而避免内存溢出而导致程序崩溃的情况的.为了更高效地回收垃圾,V8引入了两个垃圾回收器,它们分别针对不同 ...
- CMU15445 (Fall 2020) 数据库系统 Project#2 - B+ Tree 详解(下篇)
前言 上一篇博客中实现了单线程 B+ 树的查找.插入.删除和迭代操作,这篇博客将完成实验二的剩余任务:并发 B+ 树.实现 B+ 树并发访问最简单的方法就是在整棵树上加一把大锁,但是这样会导致过多线程 ...
- C#.NET CORE .NET6 RSA 私钥签名 公钥验签(验证签名) ver:20230614
C#.NET CORE .NET6 RSA 私钥签名 公钥验签(验证签名) ver:20230614 环境说明: .NET CORE 版本:.NET 6 . .NET CORE 对于RSA的支持: 1 ...
- 【HMS Core】Health Kit注册订阅后,每种设备都会通过相同的回调地址上传数据?
[问题描述1] 注册订阅后,每种设备都会通过相同的回调地址上传数据? [解决方案] 一般和设备关系不大.订阅回调地址只有一个,当用户完成订阅,且用户数据在云端发生变化时,我们会向您提供的订阅地址发送 ...
- Nginx+php关联
nginx配置php选项,解除对IIS.Apache的php环境依赖 php.ini配置 取消extension_dir注释 取消cgi.fix_pathinfo注释 nginx.conf配置 取消 ...
- 【技术积累】Mysql中的SQL语言【技术篇】【二】
什么是多表查询?如何在MySQL中进行多表查询? 多表查询就是在一个查询中涉及到多个表,通过特定的关联方式连接多个表,并根据条件从中查询出所需要的数据. 多表查询是关系型数据库中最为基础的应用之一. ...
- Java通用返回工具类Result
通用返回类Result 前言:Java项目搭建时,常常需要去封装一个通用型的Result工具类,下面就是我自己封装的常用的返回类,可以直接使用.(有部分Swagger注解,使用时可忽略) 第一步.创建 ...
- VueJs禁止页面鼠标右键、选中、调用开发者工具
1.禁止鼠标右键操作 // 禁止鼠标右键 window.oncontextmenu = function () { return false; }; 2.禁止选中网页内容 // 禁止选中网页上内容 w ...
- c语言分析和循坏对应的汇编定义格式(Debug版本)
c语言if单分支结构所对应的汇编代码结构 #include "stdafx.h" int main(int argc, char* argv[]) { if(argc > 8 ...