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

Sql server查询汇总补缺月份

Excel做图表的时候,如果你坐标是日期的时候,它会自动给你在图标上给你补全日期,这个有人喜欢有人忧,不过我忧的不是在Excel中,我忧的是要在Appsmith中的图表中显示连续的月份,希望在sql server查询中要补全缺失的月份。

一.需求:通过销售表汇总出来的数据为
月份          次数
1/2025     100
2/2025     300
4/2025     200
6/2025       50
在图表上我们希望显示的柱状图中这些缺失的月份需要用0补全,显示的数据为本月之前的连续12个月。


二.解法一:先汇总残缺数据再补全
先Sql Query汇总获取数据,然后JS再遍历补齐空缺,觉得太麻烦,放弃。


三.解法一:自定义月份表
定义一个序列表 MonthTable(01,02,03,04, 05,06,07,08,09,10,11,12),字段名为TMONTH,然后通过not in 补齐,因为会跨年,所以高于本月,年份就是取去年。
DECLARE
-- 结束日期(默认当前日期)
@EndDate DATE = GETDATE(), 
--当前月份
@CurrentM TINYINT =MONTH(GETDATE()),
--去年
@LastY INT = YEAR(GETDATE())-1
-- 计算开始日期(结束日期往前推11个月)
DECLARE @StartDate DATE = DATEADD(MONTH, -11, @EndDate);

--合并
SELECT T.YearMonthSort,T.TotalCount FROM 
(
--先汇总
( SELECT 
FORMAT(SaleDate, 'MM/yyyy') AS YearMonthSort,
COUNT(1) AS TotalCount
FROM Sales 
WHERE SaleDate BETWEEN @StartDate AND @EndDate
GROUP BY FORMAT(SaleDate, 'MM/yyyy')
)
UNION ALL
--补缺月份数据
(
SELECT CASE WHEN TMONTH>@CurrentM THEN CAST(TMONTH AS VARCHAR)+'/'+CAST(@LastY AS VARCHAR) ELSE  CAST(TMONTH AS VARCHAR)+'/'+CAST(YEAR(GETDATE()) AS VARCHAR)   END AS  YearMonthSort ,
0 AS TotalCount
FROM  MonthTable 
WHERE TMONTH NOT IN (SELECT DISTINCT MONTH(SaleDate) FROM Sales)
)  
) T ORDER BY T.YearMonthSort

四.解法三公用表表达式(CTE)
WITH cte_name (column_name1, column_name2, ...)
AS
(
CTE_query_definition
)
SELECT * FROM cte_name;

其实原理和自定义类似,定义的是一个临时命名的结果集,供后续查询使用,不需要一个自定义的实体表。
DECLARE 
@EndDate DATE = GETDATE(), -- 结束日期(默认当前日期)
@MonthCount Tinyint = 12 ;  --12个月
-- 计算开始日期(结束日期往前推11个月)
DECLARE @StartDate DATE = DATEADD(MONTH, -11, @EndDate);

-- 生成连续月份序列的CTE
;WITH MonthSeries AS (
SELECT TOP (@MonthCount)
DATEADD(MONTH, ROW_NUMBER() OVER(ORDER BY object_id) - 1, @StartDate) AS MonthStart
FROM sys.all_objects
),
YearMonthSeries AS (
SELECT 
FORMAT(MonthStart, 'yyyyMM') AS YearMonthSort,
FORMAT(MonthStart, 'MM/yyyy') AS YearMonthDisplay
FROM MonthSeries
),
-- 业务数据汇总
BusinessData AS (
SELECT 
FORMAT(SaleDate, 'yyyyMM') AS YearMonthSort,
count(1) AS TotalCount
FROM Sales
WHERE SaleDate BETWEEN @StartDate AND @EndDate
GROUP BY FORMAT(SaleDate, 'yyyyMM')
)
-- 最终结果(确保连续12个月)
SELECT 
y.YearMonthDisplay AS [年月],
ISNULL(b.TotalCount, 0) AS [销售次数]
FROM YearMonthSeries y
LEFT JOIN BusinessData b ON y.YearMonthSort = b.YearMonthSort
ORDER BY y.YearMonthSort;

其实自己喜欢第二个方法,直接简单,不过方法三看起来专业,练练CTE才用方法三,。

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

相关文章:

  • 【NLP舆情分析】基于python微博舆情分析可视化系统(flask+pandas+echarts) 视频教程 - 热词评论查询功能实现
  • Android开发中内存泄漏问题治理方案
  • 四通OKI5560SC针式打印机如何复位清零和恢复出厂设置??
  • 昇思学习营-昇思+香橙派+deepseek介绍课程内容及心得
  • Chukonu 阅读笔记
  • Rerank 模型的其中两种路径:BERT 相似度与 CoT 推理
  • 如何应对心事干扰学习工作?
  • 高可用集群KEEPALIVED的详细部署
  • 【CTF-Web】dirsearch寻找download.php进行?path=flag.txt任意文件下载
  • 深入解析命名管道:原理、实现与进程间通信应用
  • 机器学习对中特估股票关键特征选取的应用与研究
  • 【橘子分布式】gRPC(番外篇-监听流)
  • Thinkph6中常用的验证方式实例
  • 【时时三省】(C语言基础)用指向函数的指针作函数参数
  • 网络:应用层
  • 【硬件-笔试面试题】硬件/电子工程师,笔试面试题-30,(知识点:传输线特性阻抗,影响因素)
  • 【web应用】基于Vue3和Spring Boot的课程管理前后端数据交互过程
  • 1、虚拟机安装
  • InfluxDB Flux 查询协议实战应用(二)
  • Linux726 raid0,raid1,raid5;raid 创建、保存、停止、删除
  • Python 程序设计讲义(22):循环结构——for 循环
  • 使用FRP搭建内网穿透工具,自己公网服务器独享内外网端口转发
  • C++ APM异步编程模式剖析
  • 2025微前端架构研究与实践方案
  • 【6G新技术探索】AG-UI(Agent User Interaction Protocol) 协议介绍
  • Flutter开发实战之动画与交互设计
  • Java 注解(Annotation)详解:从基础到实战,彻底掌握元数据驱动开发
  • 详细介绍MySQL的索引类型
  • mybatis-plus从入门到入土(三):持久层接口之IService
  • 【MySQL】MySQL 缓存方案