生成包含多个表/查询的 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 报告的主要内容,如果未能解决你的问题,请参考以下文章
通过 VBA 自动使用查询从 Ms Access 2007 生成报告