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;
不过,与交叉表不同的是,当向数据添加新条件代码时,这不会自动添加新列。如果您有很多条件代码,它也会很麻烦。
假设我有一个数据库,其中包含关于某些唯一对象的两种不同类型的信息,比如它们的 '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;
不过,与交叉表不同的是,当向数据添加新条件代码时,这不会自动添加新列。如果您有很多条件代码,它也会很麻烦。