Access SQL:如何创建具有可能为空行的交叉表查询

Access SQL : How to create a crosstab query with a potentially empty row

假设我有一个数据库,其中包含关于某些唯一对象的两种不同类型的信息,比如它们的 'State' 和 'Condition' 为它们的分类器命名。 State 可以取值 A、B、C 或 D,条件取值 X 或 Y。根据我从何处获取数据,有时该数据库缺少特定对的条目。

根据这些数据,我想进行交叉表查询,以显示具有给定状态和条件组合的数据计数,但即使给定行为 0,它仍会产生一行。对于例如,我想要以下 table:

Unit | State | Condition
 1   |  A    |     X
 2   |  B    |     Y
 3   |  C    |     X
 4   |  B    |     Y
 5   |  B    |     X
 6   |  B    |     Y
 7   |  C    |     X

要生成以下交叉表:

Count |   X   |   Y
  A   |   1   |   0  
  B   |   1   |   3  
  C   |   2   |   0  
  D   |   0   |   0  

任何会留下空白而不是零的帮助也适用于目的,这些被粘贴到模板 Excel 文档中,该文档要求每个交叉表都有一个精确的维度。

我尝试过的:

标准交叉表SQL

TRANSFORM Count(Unit) 
SELECT Condition 
FROM Sheet
GROUP BY Count(Unit)
PIVOT State;

显然不起作用,因为它不会增加出现 D 的可能性。通过嵌套的 IIf 明确命名为可能值的 PIVOT 也没有任何作用,也没有将它与 TRANSFORM 子句变量周围的 Nz() 组合。

TRANSFORM Count(sheet.unit) AS CountOfunit
SELECT AllStates.state
FROM AllStates LEFT JOIN sheet ON AllStates.state = sheet.state
GROUP BY AllStates.state
PIVOT sheet.condition;

这使用了一个 table "AllStates",其中有一行用于您要强制进入结果的每个状态。它将为既不是条件 X 也不是条件 Y 的条目生成一个额外的列 - 这是状态 D 的强制条目结束的地方,即使计数为 0。

如果你的条件比较少,可以用这个代替:

SELECT AllStates.state, Sum(IIf([condition]="x",1,0)) AS X, Sum(IIf([condition]="Y",1,0)) AS Y
FROM AllStates LEFT JOIN sheet ON AllStates.state = sheet.state
GROUP BY AllStates.state;

不过,与交叉表不同的是,当向数据添加新条件代码时,这不会自动添加新列。如果您有很多条件代码,它也会很麻烦。