掌握 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 的使用技巧,并应用于实际的报表开发中,为业务分析提供更精确的数据支持。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/58470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

APScheduler:强大的Python定时任务调度器

安装 使用pip安装APScheduler&#xff1a; pip install apscheduler基本概念 APScheduler有四种组件&#xff1a; Triggers&#xff1a;包含调度逻辑&#xff0c;每个作业有其专属触发器&#xff0c;决定下次运行时间。触发器无状态&#xff0c;仅依据初始配置工作。Job St…

电子电气架构 --- 车载芯片现状

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

我docker拉取mysql镜像时用的是latest,我该怎么看我的镜像版本是多少?可以通过一下三种方法查看

我docker拉取mysql镜像时用的是latest&#xff0c;我该怎么看我的镜像版本是多少&#xff1f; 方法一&#xff1a;查看 Docker 镜像标签 你可以查看 Docker 镜像的标签信息&#xff0c;了解当前使用的 MySQL 镜像版本。 具体步骤如下&#xff1a; 1. 列出本地 Docker 镜像&am…

识别风险的提示清单

在PMBOK&#xff08;《项目管理体系指南》&#xff09;中&#xff0c;介绍了这样一个概念&#xff0c;在识别风险时&#xff0c;可以提供一个参考清单&#xff0c;让大家基于一个清单来思考&#xff0c;这个项目可能有哪些具体的风险。 PMBOK中的风险提示清单&#xff0c;包括…

【网络安全】从NA到P1,我是如何扩大思路的?

未经许可,不得转载。 文章目录 正文正文 在这篇文章中,我将向大家展示一个我发现的漏洞,该漏洞利用了一个硬编码的 Basic 认证头,获取了管理员权限。 首先,假设公司域名为“target.com”。 第一步是使用多种工具(如 Amass、subfinder、findomain 等)收集与该组织相关…

Unreal Engine 5 C++(C#)开发:使用蓝图库实现插件(二)编辑BPLibrary.h中的枚举及结构体

目录 引言 一、头文件编写 1.1Kismet/BlueprintFunctionLibrary.h 1.2BPLibrary.generated.h的作用 1.3IImageWrapper.h 1.4 IImageWrapperModule.h 1.5 Engine/Texture2D.h 1.6CoreMinimal.h 二、定义图片/路径类型的枚举 2.1图片枚举类EImageType 2.2路径枚举类EPath…

Vuestic 整理使用

简单示例 1. 条件渲染 2. 列表渲染 3. 组件插槽 4. 插值语法 5. 前后端路由的区别(还是转一下,可以减少代码量)SFC 构建 … … Okay&#xff0c;可以干活了&#xff0c;通顺 数据表的操作更加简化了 数据类别通过后端路由区别,但是还得由前端路由转一下 简单了许多呀,上脚手…

ssm017网上花店设计+vue(论文+源码)_kaic

设计题目&#xff1a;网上花店的设计与实现 摘 要 网络技术和计算机技术发展至今&#xff0c;已经拥有了深厚的理论基础&#xff0c;并在现实中进行了充分运用&#xff0c;尤其是基于计算机运行的软件更是受到各界的关注。加上现在人们已经步入信息时代&#xff0c;所以对于信…

网页上视频没有提供下载权限怎么办?

以腾讯会议录屏没有提供下载权限为例&#xff0c;该怎么办呢&#xff1f; 最好的办法就是找到管理员&#xff0c;开启下载权限。如果找不到呢&#xff0c;那就用这个办法下载。 1.打开Microsoft Edge浏览器的扩展 2.搜索“视频下载”&#xff0c;选择“视频下载Pro” 3.点击“…

「Mac畅玩鸿蒙与硬件5」鸿蒙开发环境配置篇5 - 熟悉 DevEco Studio 界面

本篇将详细介绍 DevEco Studio 的界面布局和主要功能模块&#xff0c;帮助开发者熟悉开发环境&#xff0c;提高开发效率。通过了解各个界面区域&#xff0c;开发者可以顺利找到所需工具&#xff0c;流畅开展鸿蒙应用开发。 关键词 DevEco Studio界面布局功能模块开发环境 一、…

理解 Vue 的单向数据流

引言 Vue.js 是一个渐进式的 JavaScript 框架&#xff0c;以其简洁和高效的特性受到广大开发者的喜爱。在 Vue 应用中&#xff0c;数据流的设计是其核心概念之一。Vue 采用的是单向数据流&#xff08;One-Way Data Flow&#xff09;&#xff0c;这种设计模式使得数据流动更加清…

使用pyecharts绘制词云图

一、什么是词云图&#xff1f; 词云图是一种用来展现高频关键词的可视化表达&#xff0c;通过文字、色彩、图形的搭配&#xff0c;产生有冲击力地视觉效果&#xff0c;而且能够传达有价值的信息。 制作词云图的网站有很多&#xff0c;简单方便&#xff0c;适合小批量操作。 …

一、ARMv8寄存器之通用、状态、特殊寄存器

ARMV8核心寄存器数量是非常大的&#xff0c;为了更好的学习&#xff0c;可以划分为以下几大类&#xff1a; 通用寄存器。这类寄存器主要是用来暂存数据和参与运算。通过load\store指令操作。状态寄存器。AArch64体系结构使用PSTATE寄存器表示当前处理器状态。特殊寄存器。有专门…

云渲染突破酒店3D动画渲染速度与成本瓶颈!

3D动画已经成为众多行业&#xff0c;尤其是酒店业&#xff0c;用于营销和展示其独特卖点的重要工具。通过生动的3D动画&#xff0c;酒店能够突出其特色和优势&#xff0c;从而吸引更多潜在客户。然而&#xff0c;在3D动画制作过程中&#xff0c;渲染环节往往是一个耗时且技术要…

Mybatis-Plus中 updateById 无法将已有值的字段更新为 null

在 MyBatis-Plus 中&#xff0c;使用updateById&#xff0c;null字段并不会更新&#xff0c;其实是和更新的策略有关&#xff0c;当然&#xff0c;也有插入策略。 1、调整全局策略&#xff08;会对所有的字段都忽略判断&#xff0c;如果一些字段不想要修改&#xff0c;但是传值…

HTML入门教程23:HTML脚本

一、嵌入JavaScript的方式 在HTML中嵌入JavaScript脚本有三种主要方式&#xff1a; 内联脚本&#xff1a;直接在HTML文档的<script>标签中编写JavaScript代码。外部脚本&#xff1a;将JavaScript代码保存在独立的.js文件中&#xff0c;并在HTML文档中通过<script>…

LabVIEW偏振调制激光高精度测距系统

在航空航天、汽车制造、桥梁建筑等先进制造领域&#xff0c;许多大型零件的装配精度要求越来越高&#xff0c;传统的测距方法在面对大尺寸、高精度测量时&#xff0c;难以满足工业应用的要求。绝对测距技术在大尺度测量上往往会因受环境影响大、测距精度低而无法满足需求。基于…

微信小程序如何实现地图轨迹回放?

要在Uni-app中实现微信小程序的地图轨迹回放功能&#xff0c;你可以按照以下步骤进行操作&#xff1a; 在Uni-app项目中引入地图组件&#xff1a;在页面中使用uni-app提供的map组件&#xff0c;可以使用uni.createMapContext方法获取地图上下文对象&#xff0c;以便后续操作地图…

WPF+MVVM案例实战(六)- 自定义分页控件实现

文章目录 1、项目准备2、功能实现1、分页控件 DataPager 实现2、分页控件数据模型与查询行为3、数据界面实现 3、运行效果4、源代码获取 1、项目准备 打开项目 Wpf_Examples&#xff0c;新建 PageBarWindow.xaml 界面、PageBarViewModel.cs ,在用户控件库 UserControlLib中创建…

WPF+MVVM案例实战(十一)- 环形进度条实现

文章目录 1、运行效果2、功能实现1、文件创建与代码实现2、角度转换器实现3、命名空间引用3、源代码下载1、运行效果 2、功能实现 1、文件创建与代码实现 打开 Wpf_Examples 项目,在Views 文件夹下创建 CircularProgressBar.xaml 窗体文件。 CircularProgressBar.xaml 代码实…