当前位置: 首页 > news >正文

SQL 合并两个时间段的销售数据:FULL OUTER JOIN + COALESCE

FULL OUTER JOIN 基础

FULL OUTER JOIN(全外连接)是SQL中一种连接操作,它会返回两个表中所有记录:

  • 匹配的记录(两个表都有的数据)

  • 左表独有的记录(右表对应部分为NULL)

  • 右表独有的记录(左表对应部分为NULL)


MySQL中的实现方式

MySQL本身不支持FULL OUTER JOIN语法,但可以通过以下方式模拟:

left  join  + union (去除重复数据) + right  join 

​场景​​: 合并两个时间段的销售数据

SELECTCOALESCE(a.date, b.date) AS date,COALESCE(a.product_id, b.product_id) AS product_id,COALESCE(a.product_name, b.product_name) AS product_name,COALESCE(a.sales_quantity, 0) AS period1_sales,COALESCE(b.sales_quantity, 0) AS period2_sales,COALESCE(b.sales_quantity, 0) - COALESCE(a.sales_quantity, 0) AS sales_difference
FROM sales_period1 a
LEFT JOIN sales_period2 b ON a.date = b.date AND a.product_id = b.product_id
UNION
SELECTCOALESCE(a.date, b.date),COALESCE(a.product_id, b.product_id),COALESCE(a.product_name, b.product_name),COALESCE(a.sales_quantity, 0),COALESCE(b.sales_quantity, 0),COALESCE(b.sales_quantity, 0) - COALESCE(a.sales_quantity, 0)
FROM sales_period1 a
RIGHT JOIN sales_period2 b ON a.date = b.date AND a.product_id = b.product_id
WHERE a.date IS NULL  -- 只取右表独有的数据
ORDER BY date, product_id;

​思路​​:

  • MySQL 无原生 FULL OUTER JOIN,用 LEFT JOIN + UNION + RIGHT JOIN 模拟。
  • COALESCE 填充缺失值为 0 或默认值。

​建表示例​​:

CREATE TABLE sales_period1 (date DATE,product_id INT,product_name VARCHAR(50),sales_quantity INT,PRIMARY KEY (date, product_id)
);CREATE TABLE sales_period2 (date DATE,product_id INT,product_name VARCHAR(50),sales_quantity INT,PRIMARY KEY (date, product_id)
);INSERT INTO sales_period1 (date, product_id, product_name, sales_quantity) VALUES
('2023-01-01', 1, 'Laptop', 10),
('2023-01-02', 2, 'Smartphone', 20);INSERT INTO sales_period2 (date, product_id, product_name, sales_quantity) VALUES
('2023-01-01', 1, 'Laptop', 15),
('2023-01-03', 3, 'Headphones', 5);

http://www.dtcms.com/a/328604.html

相关文章:

  • vue文件或文件夹拖拽上传
  • 悬空标记攻击 -- idekctf 2025 CTFinder
  • qt界面优化--api绘图
  • 杰里常用功能API
  • 科普:python中的“__init__.py”与“import”的关系
  • React中的Hook到底是个什么鬼
  • 北京-4年功能测试2年空窗-报培训班学测开-第七十四天-线下面试-聊的很满意但可能有风险-等信吧
  • mysql中的常见的索引类型及其特点
  • 【活动回顾】开源共建 · 智能体时代的 AI 基础设施全栈实践
  • 并发编程中的 ABA 问题:从原理到实战解决方案
  • Java数据结构之LinkedList
  • 电子电路原理学习笔记---第5章特殊用途二极管---第2天
  • 基于51单片机RFID智能门禁系统红外人流量计数统计
  • -bash: ./restart.sh: /bin/bash^M: 坏的解释器: 没有那个文件或目录
  • MySQL 从入门到精通:基础概念与操作指南
  • Sklearn 机器学习 异常值检测 局部异常因子算法LOF
  • SQL连接操作全解析:从入门到精通
  • 某跨国金融机构法律法规自动文本摘要(ATS/文本大意提取)功能规划
  • 嵌入式第二十六天(文件IO相关操作)
  • [Robotics_py] docs | 机器人状态/位姿 | 环境表示_栅格地图
  • 准则 :用“检测到什么”的方式来编写需求条件
  • Python 异常捕获
  • 为什么我换了项目管理软件?
  • 如何在 Odoo 18 管理产品文档手册
  • Redis面试题及详细答案100道(16-32) --- 数据类型事务管道篇
  • 第23章,景深:技术综述
  • 软件测试之功能测试
  • 嵌入式系统学习Day17(文件编程)
  • (树形 dp、数学)AT_dp_v Subtree 题解
  • 架构设计:设计原则