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

T-SQL技术求助:补全2018年4月13日-15日缺失的客户统计数据

解决T-SQL中补全缺失日期统计数据的问题

我明白你遇到的困扰:在统计2018年4月8日至18日的客户数据时,4月13日到15日的记录缺失,需要用T-SQL补全这些日期的统计值(通常用0填充缺失的客户数)。下面是具体的解决方案:

核心思路

补全缺失日期的关键是先生成覆盖目标时间段的连续日期序列,再将原统计数据与这个序列做左连接,最后对缺失的统计字段进行填充。

具体实现代码

-- 第一步:生成目标时间段的连续日期序列
WITH DateRange AS (
    SELECT CAST('2018-04-08' AS DATE) AS AsOfDate
    UNION ALL
    SELECT DATEADD(DAY, 1, AsOfDate)
    FROM DateRange
    WHERE AsOfDate < CAST('2018-04-18' AS DATE)
),
-- 第二步:获取原查询的每日统计结果(保留你的过滤条件)
OriginalDailyStats AS (
    SELECT 
        [AsOfDate],
        SUM([TotalCustomers]) AS TotalSubs,
        SUM([HSDCustomers]) AS HSDSubs,
        SUM([PhoneCustomers]) AS PhoneSubs,
        SUM([VideoCustomers]) AS VideoSubs
    FROM [vDailyCustomerCounts]
    WHERE 
        Sourcesystem = 'ICOMS' 
        AND Asofdate BETWEEN '2018-04-08' AND '2018-04-18'
        AND isc... -- 补全你原查询中剩余的过滤条件
    GROUP BY [AsOfDate] -- 必须按日期分组,才能和日期序列关联
)
-- 第三步:左连接日期序列与统计结果,填充缺失值
SELECT 
    dr.AsOfDate,
    ISNULL(ods.TotalSubs, 0) AS TotalSubs,
    ISNULL(ods.HSDSubs, 0) AS HSDSubs,
    ISNULL(ods.PhoneSubs, 0) AS PhoneSubs,
    ISNULL(ods.VideoSubs, 0) AS VideoSubs
FROM DateRange dr
LEFT JOIN OriginalDailyStats ods ON dr.AsOfDate = ods.AsOfDate
ORDER BY dr.AsOfDate;

代码细节说明

  • DateRange CTE:通过递归方式生成从2018-04-08到2018-04-18的所有连续日期,确保没有遗漏。如果你的SQL Server版本较低(如2008及之前),可以改用master.dbo.spt_values等系统表生成日期序列,避免递归性能问题。
  • OriginalDailyStats CTE:基于你的原查询补充了GROUP BY [AsOfDate]——只有按日期单独统计,才能和日期序列一一关联;同时保留了你原有的所有过滤条件,保证统计逻辑一致。
  • 最终查询:用左连接将日期序列和统计结果关联,ISNULL函数把缺失日期的统计值替换为0(如果需要保留NULL可以去掉ISNULL),最后按日期排序让结果更直观。

额外注意点

  • 确保AsOfDate字段是DATE类型,避免时间部分干扰日期关联。
  • 如果原视图vDailyCustomerCounts中同一日期有多条记录,SUM函数会自动合并统计,符合你的需求。

内容的提问来源于stack exchange,提问作者farmerian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:47:26