生成包含多个表/查询的 MS Access 报告

Posted

技术标签:

【中文标题】生成包含多个表/查询的 MS Access 报告【英文标题】:Generate MS Access report that includes multiple tables/queries 【发布时间】:2012-10-01 14:23:56 【问题描述】:

我正在使用 Access 2007 从部门内的多个单位导入统计数据 (Excel)。尽管它们共享相似的字段,但每个单元都有自己的表,因为它们还具有需要跟踪的单元特定数据/字段。

Table:UnitA -(字段:日期、汽车、船、标签、枪支、失踪人员等)

Table:UnitB -(Fields:Date,Cars, Boats, Tags, Guns, Bench Warrants, etc.)

Table:UnitC -(字段:日期、汽车、船、标签、枪支、指纹等)

我需要创建一个查询 START DATE 和 END DATE 的摘要报告,然后生成一个将显示的报告:

每条记录中每个单独字段的总和,即 Sum([Fingerprints]) 每个记录中每个共享字段的总和,即 Sum([UnitA!Cars]) + Sum([UnitB!Cars]) 等。

我可以毫无问题地为每个单独的单元创建报告。

当我找到三个单元报告并尝试使用子报告时,我的问题就开始了。 Access 将提示我输入新的开始日期和结束日期。

有人有更好的解决方案吗?我是否应该创建一个“提示”表单,其中包含可以从每个查询中访问的开始日期和结束日期字段?

【问题讨论】:

【参考方案1】:

更好 - 将共享单位数据导入单位表,然后将统计数据导入明细表:

CREATE TABLE Unit (
    UnitID CONSTRAINT PK_unit PRIMARY KEY,
    UnitNo VarChar,
    OtherUnitInfo )

CREATE TABLE DetailCategory (
    CategoryID CONSTRAINT PK_DetailCategory PRIMARY KEY,
    Category Varchar ) -- example rows: 'Guns' 'Missing Persons' etc

CREATE TABLE Unit_DetailCategory (
    UnitID FOREIGN KEY (UnitID) REFERENCES Unit (UnitID),
    CategoryID FOREIGN KEY (CategoryID REFERENCES DetailCategory (CategoryID),
    Qty Long )

然后,您可以使用 TRANSFORM/PIVOT(类似这样的东西)来获取您的总和值:

TRANSFORM Sum(Unit_DetailCategory.Qty) AS SumOfQty
SELECT 'Sum of Unit Values' AS FunctionName
FROM DetailCategory 
RIGHT JOIN (Unit INNER JOIN Unit_DetailCategory 
    ON Unit.UnitID = Unit_DetailCategory.UnitID) 
    ON DetailCategory.CategoryID = Unit_DetailCategory.CategoryID
GROUP BY 'Sum of Unit Values'
PIVOT DetailCategory.Category

注意 - 我的语法在 CREATE 语句中可能存在缺陷,您可能必须使用 TRANSFORM/PIVOT 才能准确获得所需的内容。但这适用于我的机器。

【讨论】:

我喜欢这个主意。主表和明细表。当我最终说服员工摆脱 Excel 电子表格并继续使用 Access 或 Alpha 5 解决方案时,我可能会这样做。【参考方案2】:

您可以使用联合创建单个查询

SELECT Date, Cars, Boats, Tags, Guns,
   [Missing Persons], Null AS [Bench Warrants], Null AS Fingerprints FROM UnitA
UNION ALL
SELECT Date, Cars, Boats, Tags, Guns,
   Null,              [Bench Warrants],         Null                 FROM UnitB
UNION ALL
SELECTG Date, Cars, Boats, Tags, Guns,
   Null,              Null,                     Fingerprints         FROM UnitC

每个 SELECT 中的字段数必须相同。第一个 SELECT 的字段名称将用于结果。


但是,我建议另一种数据库设计。将所有常用字段放在一个公共表中,并将特定于单位的字段放在您以一对一关系连接的其他表中

CREATE TABLE Unit (
    UnitID  CONSTRAINT PK_unit PRIMARY KEY,
    Date datetime,
    Cars long,
    Boats long,
    Tags long,
    Guns long
)

CREATE TABLE UnitA (
    UnitID  CONSTRAINT PK_unitA PRIMARY KEY,
    [Missing Persons] Long
)
ALTER TABLE UnitA
   ADD CONSTRAINT FK_unitA_unit
   FOREIGN KEY (UnitID) REFERENCES Unit (UnitID)


CREATE TABLE UnitB (
    UnitID  CONSTRAINT PK_unitB PRIMARY KEY,
    [Bench Warrants] Long
)
ALTER TABLE UnitB
   ADD CONSTRAINT FK_unitB_unit
   FOREIGN KEY (UnitID) REFERENCES Unit (UnitID)


CREATE TABLE UnitC (
    UnitID  CONSTRAINT PK_unitC PRIMARY KEY,
    Fingerprints Long
)
ALTER TABLE UnitC
   ADD CONSTRAINT FK_unitC_unit
   FOREIGN KEY (UnitID) REFERENCES Unit (UnitID)

现在您可以使用左连接创建查询。


更简单的设计是只创建一个表,并允许空字段

CREATE TABLE Unit (
    UnitID  CONSTRAINT PK_unit PRIMARY KEY,
    Date datetime,
    Cars long,
    Boats long,
    Tags long,
    Guns long,
    [Missing Persons] Long,
    [Bench Warrants] Long,
    Fingerprints Long
)

无需直接导入 excel 表,只需链接 excel 表,然后使用自定义追加查询将其内容附加到公用表。

【讨论】:

我还推荐第一个或第三个解决方案,但这在很大程度上取决于 OP 对数据的控制程度。如果他从 SQL Server 中的表中提取数据,那么 Union 可能是最佳选择。否则,重新设计可能会更好。 我将尝试您的第二个选项。由于我们目前正在使用 Excel 电子表格从多个单位导入大量字段的统计数据,因此我将无法创建一个 montster 表。 Power,我喜欢第三种解决方案,但是当我最终将它们从 Excel 导入移动到 Access 或 Alpha 5 表单提交时,它必须是这样。

以上是关于生成包含多个表/查询的 MS Access 报告的主要内容,如果未能解决你的问题,请参考以下文章

MS Access:自定义报告生成

MS Access - 在 1 个报告中使用多个查询

更改查询时 MS Access 溢出

通过 VBA 自动使用查询从 Ms Access 2007 生成报告

错误 3296:具有多个 JOIN 的 MS Access 查询中不支持连接表达式

查询未在MS-Access中使用日期条件