跨多个表聚合 SQL 查询
Posted
技术标签:
【中文标题】跨多个表聚合 SQL 查询【英文标题】:Aggregate SQL query across multiple tables 【发布时间】:2016-01-17 08:09:06 【问题描述】:我使用的是 MS Access 2010。该数据库有一组 12 个相同的设备表,一个用于公司中 12 个不同部门中的每一个。该表跟踪需要由负责设备的人员(资源)采取的行动。我有一个简单的查询来计算具有各种状态的资源的数量。它看起来如下:
SELECT dept1.actions.resource, dept1.action.status, Count(*) AS status_count
FROM dept1.action
GROUP BY dept1.action.status, dept1.action.resource;
每个表格如下所示:
equip_id, text
resource, number (id of the resource who is responsible for the equipment)
status, number (id of the status of the action that the resource needs to do)
查询结果如下:
resource status status_count
1 1 63
2 1 79
5 1 16
6 1 3
0 3 1
1 3 1180
2 3 64
3 3 61
5 3 1
6 3 2
7 3 12
0 4 4
例如,第一行显示资源 1 有 63 件状态为 1 的设备。第二行显示资源 2 有 79 件状态为 1 的设备……以此类推。
我需要的是一个聚合查询,它为所有资源和状态组合提供公司级别的总计,即完全相同的结果表,只是 status_count 列的数字要大得多。
感谢您提供的任何帮助。
【问题讨论】:
这是 MS Access 中的一个困难查询。您应该将 12 个表合二为一。通常,具有相同结构的多个表表明数据库设计存在问题。 【参考方案1】:基本上,您可以选择数据库中每个 dep 表的计数,将它们全部合并然后求和。
SELECT resource,status,sum(status_count) as status_company_count from(
SELECT dept1.actions.resource, dept1.action.status, Count(*) AS status_count
FROM dept1.action
GROUP BY dept1.action.status, dept1.action.resource
UNION
SELECT dept2.actions.resource, dept2.action.status, Count(*) AS status_count
FROM dept2.action
GROUP BY dept2.action.status, dept2.action.resource
UNION
SELECT dept3.actions.resource, dept3.action.status, Count(*) AS status_count
FROM dept3.action
GROUP BY dept3.action.status, dept3.action.resource
.....)
group by resource,status;
【讨论】:
只需调整语法即可。 Access 使用“UNION”。 干得好,@sagi。非常感谢你。成功了。【参考方案2】:如果您能够更改架构,则将 12 个表合并到一个表中,并为部门 ID 增加一列。如果您无法更改数据库结构,也许您可以添加一个新表。然后,您可以添加一个临时表,将每个表的结果捕获到这个临时结果表 SELECT...INTO。
【讨论】:
感谢您的建议,但架构已设置。 重新考虑@majodi 的建议。您应该在良好的数据库设计中规范化您的数据。相同的表需要太多的对象来维护和复杂的查询。 MS Access 是一个文件级数据库(与服务器级企业 RDMS 不同)和快速开发工具,允许快速调整。并且由于表结构是相同的表格/报告只需要一个WHERE
子句按部门ID。
谢谢@parfait。我得到它。但实际上,Access 只是通往 SQL Server 途中的一个短暂停留。原始应用程序是用 Access(前端和后端)编写的,最终将升级为 SQL Server。但是应用程序和架构是一场灾难,这是我 25 年来见过的最糟糕的一次。不可能以它所处的状态迁移到 SQL Server。所以我们必须首先在 Access 中整理出应用程序和架构。我们最终丢弃了超过 50% 的应用程序和数据库对象。一旦系统在 Access 中稳定,我们将把后端迁移到 SQL Server。以上是关于跨多个表聚合 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章