You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:21:07