当关联的查询元素未返回值时,为表单字段设置默认值

时间:2019-07-23 21:55:11

标签: sql ms-access ms-access-forms

我有一个查询,该查询返回每个月分配给公司部门的资源成本的总和:

TRANSFORM Sum (Resource.Cost) AS ResourceCost
SELECT Department.Name
FROM (Department INNER JOIN ...
WHERE ...
GROUP BY ...
ORDER BY ...
PIVOT Format([Date],"mmmm");

这将返回以下内容:

DEPARTMENT        January February March April May June July
IT                   200     150    200   100  110 800  920
HumanResources       10      150    200   100  110 500  50
Accounting           150      00    10     20  10  0    330

如您所见,由于查询尚未返回这些费用(它们尚未插入数据库中),因此今年下几个月的值为空。

继续,我有一个显示此信息的表格,包括当年的所有月份:

DEPARTMENT        January February March April May June July August September October November December
IT                   200     150    200   100  110 800  920  #error #error    #error  #error   #error
HumanResources       10      150    200   100  110 500  50   #error #error    #error  #error   #error
Accounting           150      00    10     20  10  0    330  #error #error    #error  #error   #error

不幸的是,那些字段在该月查询没有任何关联成本的值时出错。

使用=[August]之类的值设置该值。由于查询的结果集中未包含8月的值,因此显示错误。

我想在没有信息的所有月份中显示0。我尝试了其他选项,例如=Nz([August];0),但它们没有用。

您能告诉我如何为这些字段设置值0吗?

2 个答案:

答案 0 :(得分:2)

只需在PIVOT...IN ()子句中指定字段名称,其中不适用的字段将呈现为空列。您甚至可以使用以下IN子句对列进行重新排序:

TRANSFORM Sum (Resource.Cost) AS ResourceCost
SELECT Department.Name
FROM (Department INNER JOIN ...
WHERE ...
GROUP BY ...
ORDER BY ...
PIVOT Format([Date],"mmmm") IN ('January', 'February', 'March', 
                                'April', 'May', 'June', 
                                'July', 'August', 'September', 
                                'October', 'November', 'December')

或使用MonthName + Month函数颠倒顺序进行说明:

PIVOT MonthName(Month([Date])) IN ('December', 'November', 'October', 
                                   'September', 'August', 'July', 
                                   'June', 'May', 'April', 
                                   'March', 'February', 'January')

答案 1 :(得分:0)

=Nz([August],0)在这种情况下不起作用的原因是,不是字段[August]返回null(这将导致0被返回Nz函数),而是字段[August] 在绑定查询中不存在

一种可能的解决方案是使用条件聚合代替交叉表查询,例如:

select
    department.name,
    sum(iif(month([date])=1,resource.cost,0)) as January,
    sum(iif(month([date])=2,resource.cost,0)) as February,
    ...
from
    department inner join ...
group by 
    department.name

通过仅检查month字段中的[date],我假设您只使用了一年的数据。