Access 2010 - 查询以使用 Union All 和 Sum Iif 在多个表中生成总计 count/sum 的特定事件

Access 2010 - Query to produce a total count/sum of specific occurences in multiple Tables using Union All and Sum Iif

我有一个包含四个 table 的数据库:Table 1、2、3 和 4。每个 table 包含以下字段:ID(自动编号)、日期( Date/Time)、名称(文本)和项目(文本)

我创建了一个 SQL 查询,它使用 Union All 和一个 Sum Iif 表达式来检索出现在 "Apples"、"Oranges" 和 "Pears"每个人的项目列。例如,当查询 运行s 时,我希望查询向我提供日期、个人姓名以及 "Apples"、"Oranges"、[=33= 的总计] "Pears" 日期和个人。 (12/15/2015 - Dee Wolf - 15 个苹果、10 个橙子、20 个梨)

问题: 我的查询成功计算了所有 4 个 table 中的所有数据,但是,它没有生成总数。相反,它给我每个 table 的 1 比 1 计数。例如:Table 1 将显示 John 有 1 个苹果和 1 个橙子,其中 Table 2 显示 John 有 2 个苹果和 1 个橙子。当我 运行 我的查询时,它会显示 John 有 2 个苹果、1 个苹果、1 个橙子和 1 个橙子(每个 table 都有一个结果),但我只想说 John 有 3 个苹果总数。

我在另一个数据库中编写了这段代码,它似乎产生了我想要的结果。但我不确定为什么我无法重现结果。我是不是忽略了什么?

这里是 SQL:

SELECT Table1.Date, Table1.Name, Sum(IIf([Table1]![Item]="Apples",1,Null)) AS CountApples, Sum(IIf([Table1]![Item]="Oranges",1,Null)) AS CountOranges, Sum(IIf([Table1]![Item]="Pears",1,Null)) AS CountPears
FROM Table1
GROUP BY Table1.Date, Table1.Name
HAVING (((Table1.Date) Between [SS/SS/SS] And [EE/EE/EE]) AND ((Table1.Name)))
UNION ALL
SELECT Table2.Date, Table2.Name, Sum(IIf([Table2]![Item]="Apples",1,Null)) AS CountApples, Sum(IIf([Table2]![Item]="Oranges",1,Null)) AS CountOranges, Sum(IIf([Table2]![Item]="Pears",1,Null)) AS CountPears
FROM Table2
GROUP BY Table2.Date, Table2.Name
HAVING (((Table2.Date) Between [SS/SS/SS] And [EE/EE/EE]) AND ((Table2.Name)))
UNION ALL
SELECT Table3.Date, Table3.Name, Sum(IIf([Table3]![Item]="Apples",1,Null)) AS CountApples, Sum(IIf([Table3]![Item]="Oranges",1,Null)) AS CountOranges, Sum(IIf([Table3]![Item]="Pears",1,Null)) AS CountPears
FROM Table3
GROUP BY Table3.Date, Table3.Name
HAVING (((Table3.Date) Between [SS/SS/SS] And [EE/EE/EE]) AND ((Table3.Name)))
UNION ALL
SELECT Table4.Date, Table4.Name, Sum(IIf([Table4]![Item]="Apples",1,Null)) AS CountApples, Sum(IIf([Table4]![Item]="Oranges",1,Null)) AS CountOranges, Sum(IIf([Table4]![Item]="Pears",1,Null)) AS CountPears
FROM Table4
GROUP BY Table4.Date, Table4.Name
HAVING (((Table4.Date) Between [SS/SS/SS] And [EE/EE/EE]) AND ((Table4.Name)));
HAVING ((...) AND ((Table1.Name)))

仍然没有多大意义...

要获得总计,请将整个查询包装到 Sum() / GROUP BY 查询中:

SELECT [Date], [Name], Sum(CountApples) AS TotalApples, Sum(CountOranges) AS TotalOranges, 
                       Sum(CountPears) AS TotalPears
FROM (
    -- your UNION query goes here
)
GROUP BY [Date], [Name]

(无耻地摘自