当前位置: 首页 > 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.lryc.cn/news/600626.html

相关文章:

  • 【iOS】网易云仿写
  • 基于深度学习的胸部 X 光图像肺炎分类系统(七)
  • springboot 前后端,基于票据+SHA派生密钥+SM4加解密
  • 经典IDE之Turbo C
  • 基于MC9S12XEP100的整车控制器(VCU)设计
  • 【Zephyr】Window下的Zephyr编译和使用
  • Redis的数据淘汰策略是什么?有哪些?
  • 资产负债表及其数据获取
  • 【LeetCode 热题 100】79. 单词搜索——回溯
  • 进阶数据结构:用红黑树实现封装map和set
  • element-plus安装以及使用
  • 机器人仿真(2)Ubuntu24.04下RTX5090配置IsaacSim与IsaacLab
  • Java实现大根堆与小根堆详解
  • 【数据结构】栈和队列的实现
  • 基于DataX的数据同步实战
  • 详解力扣高频SQL50题之1141. 查询近30天活跃用户数【简单】
  • STM32-定时器的基本定时/计数功能实现配置教程(寄存器版)
  • 手动开发一个串口调试工具(二):Qt 串口类基本认识与使用
  • ClickHouse高性能实时分析数据库-消费实时数据流(消费kafka)
  • 【Linux系统】理解硬件 | 引入文件系统
  • Kotlin线程同步
  • 高并发微服务限流算法方案对比与实践指南
  • 告别Vite脚手架局限!MixOne Beta测试招募:你的需求,我们来实现
  • 基于 ThinkPHP 开发的垂直化网址导航
  • 深入解析Hadoop如何实现数据可靠性:三副本策略、校验和验证与Pipeline复制
  • 使用Spring Boot创建Web项目
  • Java 大视界 -- Java 大数据在智能安防视频监控系统中的视频语义理解与智能检索进阶(365)
  • 【工程化】浅谈前端构建工具
  • nginx一个域名下部署多套前端项目
  • 机器学习特征工程详解:特征选择与降维(PCA)