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

掌握 CTE 技巧,实现连续日期和月份的 SQL 报表统计

在 SQL 查询中,报表统计往往涉及到特定时间段内的数据汇总,如每日、每月的销售数据等。然而,面对缺少数据的日期或月份,传统 SQL 查询可能会直接跳过这些日期,使得输出的报表在视觉上并不连续。本文将展示如何利用 CTE(通用表表达式)生成完整的时间范围,并确保报表统计结果中,数据缺失的日期或月份以 0 填充。通过这种方法,可以大大提高数据报表的完整性,使结果更加连贯清晰。

需求背景

假设我们在电商系统中有一个订单表 orders,其结构如下:

  • order_id:订单编号
  • order_date:订单日期
  • amount:订单金额

我们将基于该表,构建以下几种常见的报表统计需求:

  1. 最近 30 天的每日销售统计,包含数据缺失的日期。
  2. 最近 6 个月的月度销售统计,包含没有数据的月份。

在这两个场景中,我们希望输出的结果表中,不论是否有数据,特定时间段内的每一天或每一月都应该显示,并且缺失数据的日期或月份的销售额显示为 0


示例 1:最近 30 天的每日销售统计

为了显示最近 30 天的每日销售数据,并确保每一天都显示出来,我们首先可以利用递归 CTE 生成一个完整的 30 天日期范围,然后通过 LEFT JOIN 将订单数据连接上去。

SQL 查询示例

-- 递归 CTE 生成最近 30 天的日期范围
WITH RECURSIVE DateRange AS (SELECT CURDATE() - INTERVAL 29 DAY AS dateUNION ALLSELECT date + INTERVAL 1 DAYFROM DateRangeWHERE date + INTERVAL 1 DAY <= CURDATE()
),
Last30Days AS (SELECT order_date, amountFROM ordersWHERE order_date >= CURDATE() - INTERVAL 30 DAY
)
SELECT d.date AS order_date,COALESCE(SUM(l.amount), 0) AS daily_sales
FROM DateRange d
LEFT JOIN Last30Days l ON d.date = l.order_date
GROUP BY d.date
ORDER BY d.date;

查询解析

  1. DateRange CTE:生成最近 30 天的完整日期范围。
  2. Last30Days CTE:筛选出订单表中最近 30 天的数据。
  3. 主查询:通过 LEFT JOINDateRangeLast30Days 连接在一起,确保每一天都出现在结果中。使用 COALESCE 函数将没有数据的日期销售额填充为 0

通过该查询,我们可以得到一个包含最近 30 天每日销售额的表格,其中没有订单数据的日期也会显示为 0

示例 2:最近 6 个月的月度销售统计

同样地,为了展示最近 6 个月的月度销售数据,并包含没有订单的月份,我们可以生成一个完整的 6 个月月份范围,再将订单数据连接上去。

SQL 查询示例

-- 递归 CTE 生成最近 6 个月的月份范围
WITH RECURSIVE MonthRange AS (SELECT DATE_FORMAT(CURDATE() - INTERVAL 5 MONTH, '%Y-%m') AS monthUNION ALLSELECT DATE_FORMAT(DATE_ADD(STR_TO_DATE(month, '%Y-%m'), INTERVAL 1 MONTH), '%Y-%m')FROM MonthRangeWHERE DATE_ADD(STR_TO_DATE(month, '%Y-%m'), INTERVAL 1 MONTH) <= CURDATE()
),
Last6Months AS (SELECT DATE_FORMAT(order_date, '%Y-%m') AS month, amountFROM ordersWHERE order_date >= CURDATE() - INTERVAL 6 MONTH
)
SELECT m.month,COALESCE(SUM(l.amount), 0) AS monthly_sales
FROM MonthRange m
LEFT JOIN Last6Months l ON m.month = l.month
GROUP BY m.month
ORDER BY m.month;

查询解析

  1. MonthRange CTE:通过递归 CTE 生成最近 6 个月的完整月份范围。
  2. Last6Months CTE:提取订单表中最近 6 个月的订单数据,并格式化日期为 YYYY-MM 月份格式。
  3. 主查询:利用 LEFT JOINMonthRangeLast6Months 连接在一起,确保每个月都出现在最终结果中。使用 COALESCE 确保无数据的月份销售额为 0

这样,我们可以得到包含最近 6 个月每月销售额的表格,其中没有订单数据的月份会显示为 0,保证了数据的连续性。


总结

通过上述两个示例,我们可以看到 CTE 的强大之处。借助递归 CTE,我们可以轻松生成日期或月份范围,并将其与实际数据进行连接,确保报表统计结果的连续性。这种方法尤其适用于时间跨度较大的报表查询场景,如日统计、月统计等。

CTE 技术不仅帮助我们提高了 SQL 代码的可读性,也为实现更完整的报表数据提供了便捷手段。无论是日统计还是月统计,通过 CTE,我们都可以确保报表结果具有更高的业务价值。希望本文能帮助你掌握 CTE 的使用技巧,并应用于实际的报表开发中,为业务分析提供更精确的数据支持。

相关文章:

掌握 CTE 技巧,实现连续日期和月份的 SQL 报表统计

在 SQL 查询中&#xff0c;报表统计往往涉及到特定时间段内的数据汇总&#xff0c;如每日、每月的销售数据等。然而&#xff0c;面对缺少数据的日期或月份&#xff0c;传统 SQL 查询可能会直接跳过这些日期&#xff0c;使得输出的报表在视觉上并不连续。本文将展示如何利用 CTE…...

【表格解决问题】EXCEL行数过多,WPS如何按逐行分别打印多个纸张中

1 问题描述 如图&#xff1a;我的表格行数太多了。打印在一张纸上有点不太好看 2 解决方式 Step01&#xff1a;先选中你需要打印的部分&#xff0c;找到【页面】->【打印区域】->【设置打印区域】 Step02&#xff1a;先选中一行&#xff0c;找到【插入分页符】 Step0…...

Maven讲解从基础到高级配置与实践

一、基础认知 1.1 Maven 的主要作用 Maven 主要是用来管理 Java 项目构建流程的工具&#xff0c;包括以下几个方面&#xff1a; 依赖管理&#xff1a;通过 POM.xml 文件管理项目的外部依赖库&#xff0c;不同版本的依赖包可以通过 Maven 中央仓库自动下载&#xff0c;减少了…...

Vue3组件式父子传值

下面是使用 <script setup> 语法的 Vue 3 组件之间传值的示例。 示例 1:使用 Props 和 Emits 父组件 <template><div><h1>父组件</h1><ChildComponent :message="parentMessage" @reply="handleReply" /><p>…...

网页自动化测试和爬虫:Selenium库入门与进阶

网页自动化测试和爬虫&#xff1a;Selenium库入门与进阶 在现代Web开发和数据分析中&#xff0c;自动化测试和数据采集成为了开发流程中的重要部分。Python 的 Selenium 库是一种强大的工具&#xff0c;不仅用于网页自动化测试&#xff0c;也在网页爬虫中得到了广泛的应用。本…...

Cells 单元

Goto Data Grid 数据网格 Cells 单元 Content Alignment 内容对齐 显示数值的数据网格单元格会将其内容向右对齐。显示其他类型数据的单元格将其内容向左排列。若要更改单元格内容对齐方式&#xff0c;请处理 ColumnView.RowCellDefaultAlignment 事件。 Selection Modes 选…...

2024/11/2 安卓创建首页界面

‌Gradle 8.7 bin‌是指Gradle 8.7版本的二进制包&#xff0c;通常以.zip或.tar.gz格式提供。这个二进制包包含了运行Gradle所需的所有文件&#xff0c;用户可以直接下载并解压使用&#xff0c;无需从源代码编译。 首先了解最常用的布局 线性布局&#xff08;从上到下&#x…...

SpringSession源码分析

默认对常规Session的理解和使用&#xff0c;如何使用Set-Cookie。 Maven库 常见的spring-session-data-redis依赖spring-session-core <dependency><groupId>org.springframework.session</groupId><artifactId>spring-session-core</artifactId&…...

IIC

IIC 目录 IIC BH1750型号的光照传感器 IIC通信协议 iic物理层 IIC软件层协议 -- 那么一主多从&#xff0c;怎么选中与指定的从机通信呢&#xff1f; 从机设备地址 -- 从手册中查看 IIC 写操作 IIC 读操作 硬件IIC和模拟 IIC 使用 模拟 IIC 使用 &#xff01;&…...

LLM Observability: Azure OpenAI (一)

作者&#xff1a;来自 Elastic Vinay Chandrasekhar•Andres Rodriguez 我们很高兴地宣布 Azure OpenAI 集成现已全面上市&#xff0c;它提供了对 Azure OpenAI 服务性能和使用的全面可观察性&#xff01;另请参阅本博客的第 2 部分 虽然我们已经提供了对 LLM 环境的可视性一段…...

qt QBrush详解

1、概述 QBrush是Qt框架中的一个基本图形对象类&#xff0c;它主要用于定义图形的填充模式。QBrush可以用于填充如矩形、椭圆形、多边形等形状&#xff0c;也可以用于绘制背景等。通过QBrush&#xff0c;可以设置填充的颜色、样式&#xff08;如实心、渐变、纹理等&#xff09…...

Excel函数CUnique连接合并指定区域的唯一值

上一篇文章向大家介绍了如何使用VBA在低版本Excel中创建unique函数的方法&#xff0c;今天我跟大家分享一下如何使用函数连接指定区域的唯一值&#xff0c;也就是将unique函数获取的唯一值连接合并成一个&#xff0c;并指定连接符。 同样&#xff0c;我们需要先创建一个自定义的…...

机械革命屏幕设置为RGB

机械革命屏幕设置为RGB 如何设为机械革命屏幕显示为RGB如何设置1.win菜单下输入“显卡控制中心”2.选择显示器3.设置为RGB4.饱和度大家设为自己舒服的就行5.调整亮度 参考来源 如何设为机械革命屏幕显示为RGB 之前买的显示器&#xff0c;感觉调成sRGB看起来非常舒服。就想着是…...

开源项目-投票管理系统

哈喽,大家好,今天主要给大家带来一个开源项目-投票管理系统 投票管理系统主要有首页,发起投票,管理投票,参与投票,查看投票等功能 首页 为用户提供了一键导航到各个功能模块的便捷途径。 新增投票 用户可以在此轻松创建新的投票活动,设置投票主题、选项等信息。 管理…...

LeetCode 104.二叉树的最大深度

题目描述 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&#xff1a;3 示例 2&#xff1a; 输入&#xff1a;root [1…...

Android启动流程_Init阶段

前言 本文将会介绍 Android 启动流程&#xff0c;将基于 Android 10 代码逻辑介绍原生启动过程。 bootloader 上电 -> 加载 recovery 镜像或者 boot 镜像 -> linux kernel 启动 -> 加载 init 进程 -> 加载 zygote 进程 -> systemserver 进程 -> 系统启动 …...

萤火虫算法优化BILSTM神经网络多输入回归分析

目录 LSTM的基本定义 LSTM实现的步骤 BILSTM神经网络 代码 结果分析 展望 完整代码下载:的MATALB代码(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88755564 背影 bp神经网络是一种成熟的神经网络,应用非常广,本文用萤火虫算法…...

在线QP(QuotedPrintable)编码解码工具

具体前往&#xff1a;Quoted-printable在线编码解码工具-将给定文本编码为:可打印字符引用编码(简称&#xff1a;QP编码)&#xff0c;也支持在线解码...

【已解决】cra 配置路径别名 @ 后,出现 ts 报错:找不到模块“@/App”或其相应的类型声明。ts(2307)

cra 配置路径别名 后&#xff0c;出现 ts 报错&#xff1a;找不到模块“/App”或其相应的类型声明。ts(2307) 然后可以在 tsconfig.json 中配置 baseUrl 和 paths &#xff1a; {"compilerOptions": {"target": "es5","lib": [&quo…...

leetcode-643. 子数组最大平均数 I

文章目录 二 解法2.1 每次都重新计算2.2 使用窗口 给你一个由 n 个元素组成的整数数组 nums 和一个整数 k 。请你找出平均数最大且 长度为 k 的连续子数组&#xff0c;并输出该最大平均数。任何误差小于 10-5 的答案都将被视为正确答案。二 解法 2.1 每次都重新计算 超时 pu…...

英特尔马来西亚六厂布局:先进封装如何重塑半导体制造与供应链

1. 项目概述&#xff1a;从一则新闻到半导体制造的全球拼图前几天&#xff0c;行业里不少朋友都在转一条消息&#xff0c;说英特尔在马来西亚的封装产能布局又有新动作&#xff0c;计划要搞到六座工厂的规模。乍一看&#xff0c;这好像就是个普通的海外建厂新闻&#xff0c;但如…...

GIT 切换分支合并分支前一定要先 fetch,一定要选择远程分支进行操作

测试 GIT 切换分支 合并分支 1、切换和合并分支时&#xff0c;要选择远程的分支&#xff0c;确保本地的代码是最新的 2、切换分支前不 fetch3、切换分支前先点 fetch4、合并分支前不 fetch5、合并分支前先 fetch...

手把手教你用STM32CubeMX配置PWM驱动DRV8833模块,轻松搞定智能小车调速

基于STM32CubeMX的DRV8833电机驱动开发实战 在嵌入式开发领域&#xff0c;电机控制一直是热门且实用的技术方向。无论是智能小车、机器人还是工业自动化设备&#xff0c;精准的电机调速都是核心需求。传统开发方式需要手动配置大量寄存器&#xff0c;不仅耗时耗力&#xff0c;还…...

ENVI 5.6 + COSI-Corr插件整合指南:搞定地表形变分析的第一步

ENVI 5.6 COSI-Corr插件整合指南&#xff1a;搞定地表形变分析的第一步 对于地质测绘领域的研究人员和工程师来说&#xff0c;地表形变监测是理解地质灾害、评估基础设施安全的重要技术手段。在众多遥感分析方法中&#xff0c;COSI-Corr&#xff08;Co-registration of Optic…...

代码语义可视化架构的突破性实现:MultiHighlight如何将代码理解效率提升300%

代码语义可视化架构的突破性实现&#xff1a;MultiHighlight如何将代码理解效率提升300% 【免费下载链接】MultiHighlight Jetbrains IDE plugin: highlight identifiers with custom colors &#x1f3a8;&#x1f4a1; 项目地址: https://gitcode.com/gh_mirrors/mu/MultiH…...

Hackintool:黑苹果配置不再复杂,这款工具让你轻松搞定所有难题

Hackintool&#xff1a;黑苹果配置不再复杂&#xff0c;这款工具让你轻松搞定所有难题 【免费下载链接】Hackintool The Swiss army knife of vanilla Hackintoshing 项目地址: https://gitcode.com/gh_mirrors/ha/Hackintool 还在为黑苹果的配置问题头疼吗&#xff1f;…...

从雷达、声呐到5G和Wi-Fi 7:波束成形技术的前世今生与应用实战

从雷达、声呐到5G和Wi-Fi 7&#xff1a;波束成形技术的前世今生与应用实战 想象一下&#xff0c;你正站在一个嘈杂的鸡尾酒会上&#xff0c;周围人声鼎沸&#xff0c;但你却能清晰地听到对面朋友的每一句话——这就像波束成形技术为现代通信系统带来的"超能力"。这项…...

用Logisim搞定Educoder交通灯实训:从数码管驱动到状态机集成的保姆级避坑指南

用Logisim征服Educoder交通灯实训&#xff1a;从零搭建到联调的全链路实战手册 第一次打开Educoder平台的交通灯实训项目时&#xff0c;我盯着那些闪烁的数码管和错综复杂的线路图&#xff0c;感觉像在破解某种外星密码。三小时后&#xff0c;当我的第一个状态机模块终于通过测…...

TongWEB(东方通)实战:从零部署企业级WEB前后端项目

1. 环境准备&#xff1a;银河麒麟系统下的基础搭建 在银河麒麟桌面系统V10(SP1)兆芯版上部署企业级WEB项目&#xff0c;环境准备是第一步。我遇到过不少开发者直接跳过环境检查就急着部署&#xff0c;结果浪费大量时间排查兼容性问题。这里分享几个关键点&#xff1a; 首先是系…...

百度网盘直链解析工具:3分钟突破限速实现满速下载

百度网盘直链解析工具&#xff1a;3分钟突破限速实现满速下载 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 你是否曾为百度网盘的下载速度而烦恼&#xff1f;非会员用户经常…...