1

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

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 吗?

4

2 回答 2

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')
于 2019-07-23T23:39:34.003 回答
0

=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

通过仅检查month您所在[date]领域的数据,我假设您只使用一年的数据。

于 2019-07-23T22:05:43.703 回答