背景说明:
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函数进行列转行的更多相关文章

  1. sql的各种join连接

    SELECT * FROM TableA INNER JOIN TableB ON TableA.name = TableB.name id name id name -- ---- -- ---- ...

  2. SQL中的join连接查询

      inner join(交集 ,自然连接, 简写成join)   是最普通的连接查询,相当于早期根据where条件连接的查询     outer join(并集或部分并集,左表 + 右表)   le ...

  3. SQL Server将查询出数据进行列转行操作

    在日常的SQL Server数据查询时经常会遇到需要将数据列转换成行的操作,现将自己学习的列转行SQL语句举例如下: --首先查询语句 SELCT * FROM  YXBAK..TBYJKSTEMP ...

  4. 简单接触oracle数据库nvl函数decode函数

    SQL语句的DECODE()和NVL()函数用法 SELECT DECODE(choose_tool,0,'宝马',1,'电动车',2,'自行车','步行')  AS my_tool FROM dat ...

  5. nvl函数 oracle

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  6. Oracle中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  7. Oracle的nvl函数和nvl2函数

    一.基本语法 介绍一下oracle的nvl函数和nvl2函数. nvl函数 nvl函数基本语法为nvl(E1,E2),意思是E1为null就返回E2,不为null就返回E1. nvl2函数 nvl2函 ...

  8. 一起学Hive——总结各种Join连接的用法

    Hive支持常用的SQL join语句,例如内连接.左外连接.右外连接以及HiVe独有的map端连接.其中map端连接是用于优化Hive连接查询的一个重要技巧. 在介绍各种连接之前,先准备好表和数据. ...

  9. [转载]Oracle中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

  10. Oracel中的NVL函数

    Oracle中函数以前介绍的字符串处理,日期函数,数学函数,以及转换函数等等,还有一类函数是通用函数.主要有:NVL,NVL2,NULLIF,COALESCE,这几个函数用在各个类型上都可以. 下面简 ...

随机推荐

  1. pytorch的torch、torchvision、torchaudio版本对应关系

    torch与torchvision对应关系 torch与torchaudio对应关系

  2. 让AI更好地服务于人类社会:如何确保其安全和透明度

    目录 让AI更好地服务于人类社会:如何确保其安全和透明度 随着人工智能技术的不断发展和应用,人们越来越关注其安全和透明度.安全和透明度是人工智能发展的重要保障,能够保护人工智能系统免受恶意攻击和滥用, ...

  3. 一篇随笔入门Java

    Java helloWorld 随便新建一个文件夹存放代码 新建一个java文件 文件后缀名.java Hello.java [注意]系统可能不显示后缀名要手动打开 代码 public class H ...

  4. 园子的商业化努力:欢迎参加DataFun联合行行AI举办的数据智能创新与实践人工智能大会

    大家好,今年是园子商业化生死攸关的一年,正在艰难而努力地向前推进,今天在首页发布一篇大会推广博文,望谅解. DataFun联合行行AI举办第四届"数据智能创新与实践人工智能大会", ...

  5. 【Git】常用命令汇总

    一.仓库管理 git init:本地初始化 git clone:克隆远程仓库 git remote:远程仓库管理 git remote:查看远程仓库的信息 git remote -v:显示更详细的信息 ...

  6. JAVA小白找工作必备建议

    如果您是一名刚入门的JAVA小白,正在寻求工作机会,那么恭喜您来对地方!本文将为您提供一些建议,帮助您在求职过程中更好地展现自己的优势和准备迎接新的挑战. 1.基础知识打牢 在找工作前,务必确保您对J ...

  7. Redis解决网络抖动问题

    Redis解决网络抖动问题 所谓网络抖动问题, 简单来说就是防止用户短暂的时间内对同一个接口多次点击访问 这里利用的是redis锁的原子性和with Statement上下文管理器实现, 另外该类还支 ...

  8. APubPlat 一款Devops自动化部署、持续集成、堡垒机开源项目、友好的Web Terminal

    嗨.很高心你能进入这里,我是zane,  在这里给你介绍一款完整的Devops自动化部署工具 APubPlat - 一款完整的Devops自动化部署.持续集成.堡垒机.并且友好的Web Termina ...

  9. 如何通过cookie、session鉴权(nodejs/koa)

    http是一种无状态的协议,每一个请求都是独立的,即使同一个页面向服务器发送多次请求,服务器也无法区分是不是同一用户,所以这个时候可以借助于cookie来做身份认证,当用户登录成功,服务器为浏览器设置 ...

  10. 《Redis核心技术与实战》学习笔记总结目录

    1 Redis学习路径 去年我学习了极客时间的<Redis核心技术与实战>课程,在这门课程的学习中,我经常看到一位课代表的发言,他就是Kaito,他总结了一份Redis学习路径脑图(建议收 ...