SQL中如何关联表1表2实现上月续约量除以对应月份工作日数
解决SQL关联查询:上月续约总数除以对应月份工作日数
嘿,我来帮你把这两个查询关联起来!核心就是通过年份(YR)和月份这两个字段把表1的续约统计和表2的工作日数匹配起来,下面给你两种实用的实现方式,你可以根据自己的需求选:
方法1:用子查询直接计算单月比值
如果只需要上月的结果,这种方式直接明了,把两个统计结果分别作为子查询,然后做除法运算。注意要做数据类型转换,避免整数除法导致结果取整:
SELECT -- 上月续约总数 (SELECT COUNT(*) FROM 表1 WHERE YEAR(renewal_date) = YEAR(DATEADD(month, -1, GETDATE())) AND MONTH(renewal_date) = MONTH(DATEADD(month, -1, GETDATE()))) AS 上月续约总量, -- 对应月份的全国平均工作日数 (SELECT avg_workdays FROM 表2 WHERE YR = YEAR(DATEADD(month, -1, GETDATE())) AND MONTH = MONTH(DATEADD(month, -1, GETDATE()))) AS 当月工作日数, -- 计算最终比值(转成FLOAT避免整数除法) CAST( (SELECT COUNT(*) FROM 表1 WHERE YEAR(renewal_date) = YEAR(DATEADD(month, -1, GETDATE())) AND MONTH(renewal_date) = MONTH(DATEADD(month, -1, GETDATE()))) AS FLOAT ) / (SELECT avg_workdays FROM 表2 WHERE YR = YEAR(DATEADD(month, -1, GETDATE())) AND MONTH = MONTH(DATEADD(month, -1, GETDATE()))) AS 日均续约数
方法2:用CTE(公共表表达式)关联优化代码
如果后续需要扩展到多个月份查询,这种方式更清晰易维护。先分别统计出续约数和工作日数的结果集,再通过YR和月份字段关联:
WITH 月度续约统计 AS ( SELECT YEAR(renewal_date) AS YR, MONTH(renewal_date) AS 月份, COUNT(*) AS 续约总数 FROM 表1 -- 如果要查上月就保留这个条件,查所有月份就删掉 WHERE YEAR(renewal_date) = YEAR(DATEADD(month, -1, GETDATE())) AND MONTH(renewal_date) = MONTH(DATEADD(month, -1, GETDATE())) GROUP BY YEAR(renewal_date), MONTH(renewal_date) ), 月度工作日统计 AS ( SELECT YR, MONTH AS 月份, avg_workdays AS 平均工作日数 FROM 表2 -- 同样,查上月保留条件,查所有月份删掉 WHERE YR = YEAR(DATEADD(month, -1, GETDATE())) AND MONTH = MONTH(DATEADD(month, -1, GETDATE())) ) SELECT ms.续约总数, ws.平均工作日数, CAST(ms.续约总数 AS FLOAT) / ws.平均工作日数 AS 日均续约数 FROM 月度续约统计 ms JOIN 月度工作日统计 ws ON ms.YR = ws.YR AND ms.月份 = ws.月份
关键注意点
- 确保两个表的
YR字段格式一致(比如都是4位年份),月份字段的取值范围匹配(都是1-12的数字),不然关联会出错。 - 整数除法问题:SQL里整数相除会自动取整,所以一定要把其中一个数值转成
FLOAT或DECIMAL类型,才能得到精确的小数结果。 - 如果你的SQL方言不是SQL Server(比如MySQL),日期函数会有差异,比如
DATEADD换成DATE_SUB(CURDATE(), INTERVAL 1 MONTH),YEAR()和MONTH()函数用法基本一致。
内容的提问来源于stack exchange,提问作者Pat
相关产品推荐
相关产品推荐

