【问题标题】:Set default value for form field when associated query element doesn't return a value当关联的查询元素不返回值时,为表单字段设置默认值
【发布时间】:2019-12-02 00:07:19
【问题描述】:

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

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]。由于 August 的值不在查询的结果集中,因此会显示错误。

我想在没有信息的情况下显示所有月份的 0。我尝试了不同的选项,例如 =Nz([August];0),但没有奏效。

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

【问题讨论】:

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


    【解决方案1】:

    只需在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+ 这对我来说是一个新的 - 很棒的解决方案!
    【解决方案2】:

    =Nz([August],0) 在这种情况下不起作用的原因是不是因为字段 [August] 正在返回 null(这会导致 0Nz 函数返回),而是而是字段[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
    

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

    【讨论】:

    • 嗨,李 Mac,感谢您的回答。明天我将尝试您建议的查询。但是我宁愿不修改查询,它实际上比看起来更复杂,我为这个问题简化了它。我想知道是否有某种功能可以让我检查表单中数据的存在,例如:=ifExists([august];0)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    相关资源
    最近更新 更多