我有一个查询,该查询返回每个月分配给公司部门的资源成本的总和:
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吗?
答案 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]
,我假设您只使用了一年的数据。