You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

MS Access:如何用DSUM对同一日期行求和并添加至分组查询?

解决Access中DSUM日期字段逐行求值返回NULL的问题

先来看你原本的分组查询,用来统计每周-市场-团队维度的Audits和Incorrect数据:

SELECT t1.Week, t1.Market, t1.Team, Sum(t1.Audits) AS CFS_Audits, Sum(t1.Incorrect) AS CFS_Incorrect
FROM t1
GROUP BY t1.Week, t1.Market, t1.Team;

你想要新增一个字段,计算当前行对应Week下所有记录的Audits总和(也就是周级别的总Audits,比现有分组粒度更粗),但之前用DSUM("Audits", "t1", "[Week]="&[Week])一直返回NULL,问题确实出在日期字段的条件处理上。

问题原因

在Access的域聚合函数(比如DSUM)里,日期类型的条件必须用#符号包裹。你直接用&拼接日期值,Access会把它当成普通字符串,和字段里的日期类型值无法匹配,自然就返回NULL了。

解决方案1:修正DSUM的日期条件写法

把日期用#包裹,同时用Format函数把日期转成Access能识别的标准格式(比如yyyy-mm-dd),确保条件匹配准确:

SELECT 
    t1.Week, 
    t1.Market, 
    t1.Team, 
    Sum(t1.Audits) AS CFS_Audits, 
    Sum(t1.Incorrect) AS CFS_Incorrect,
    -- 修正后的DSUM写法,用#包裹格式化后的日期
    DSUM("Audits", "t1", "[Week] = #" & Format([Week], "yyyy-mm-dd") & "#") AS Weekly_Total_Audits
FROM t1
GROUP BY t1.Week, t1.Market, t1.Team;

这样就能逐行匹配当前行的Week日期,计算该周所有Audits的总和了。

解决方案2:用子查询替代DSUM(更高效)

如果你的数据量比较大,DSUM会逐行执行聚合,性能可能不太好。推荐用子查询预先计算每周的Audits总和,再关联到原查询,效率更高:

SELECT 
    t1.Week, 
    t1.Market, 
    t1.Team, 
    Sum(t1.Audits) AS CFS_Audits, 
    Sum(t1.Incorrect) AS CFS_Incorrect,
    weekly_totals.Total_Audits AS Weekly_Total_Audits
FROM t1
-- 关联预先计算好周总Audits的子查询
INNER JOIN (
    SELECT Week, Sum(Audits) AS Total_Audits
    FROM t1
    GROUP BY Week
) AS weekly_totals ON t1.Week = weekly_totals.Week
GROUP BY t1.Week, t1.Market, t1.Team, weekly_totals.Total_Audits;

这种方式只需要计算一次周级别的总和,然后关联到原分组结果,既避免了日期格式的问题,性能也更优。

额外提醒

如果你的Week字段是文本类型存储的日期(不推荐,建议用日期/时间类型),那第一种方案里的Format函数可能需要调整成和你文本日期一致的格式,确保条件匹配。

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

火山引擎 最新活动