2017-07-19 57 views
0

Folks。我似乎无法找到这个问题的答案。我可以在SQL Server中执行此操作,但我现在正在使用Access 2013,而我通常的SQL技巧似乎无法正常工作。从MS Access中的多个表中总计总计

我需要创建班级成本与收入总结报告。

我有三个表:班级列表,成本列表,注册列表。成本和注册(成本&收入)都通过在所有表中标识该类的关键字段与班级列表相关联。

我能够运行成本报告或收入报告,并且每个班级的总计都很好,但是当我组合它们以获取每个班级的净额时,成本会乘以注册中的行数报告,反之亦然。

我试过使用外部连接,但访问不喜欢它,即使在正确的地方[]。将excel留在访问中会更好,因为离开excel是整个重点。

tables and expected results

incorrect results

这里的坏结果背后的SQL。我知道这些连接是错误的,但我无法访问接受任何其他类型的连接。

SELECT DISTINCTROW Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date, 
     Sum(Costs.Amount) AS [Sum Of Amount], 
     Sum(Registrations.Tuition) AS [Sum Of Tuition], 
     Count(*) AS [Count Of Classes] 
FROM (Classes 
     LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID]) 
LEFT JOIN Costs ON Classes.[ID] = Costs.[Class ID] 
GROUP BY Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date; 

有什么建议吗?提前致谢。

+0

为成本和收入汇总查询构建一个汇总查询,然后将2个汇总查询加入到班表列表中。 – June7

+0

欢迎来到SO。首先,请参阅[左和右连接操作](https://support.office.com/zh-cn/article/LEFT-JOIN-RIGHT-JOIN-Operations-ebb18b36-7976-4c6e-9ea1-c701e9f7f5fb)。 SQL语法(包括JOIN关键字)与SQL Server不同。 –

+0

您提到了“SQL技巧”,“任何其他类型的连接”以及“在SQL Server中执行此操作”的功能。如果你已经尝试过这样的事情,或者如果你认为其他语法在其他地方有效,那么可以将这样的例子包括在内,而不是仅仅提及它们。这不仅可以提供可操作的东西,还可以揭示可能不会用文字表达的细节。我没有看到任何联接或语法如何让您执行单个查询来获取不同表上的聚合。即使它们是子查询,也需要分别总结成本和学费。 –

回答

0

即使将它们连接到相同的主表,您也需要两个单独的查询来汇总不同表的值。否则,SQL的select部分将在另外两个表上执行交叉连接,从而有效地为每个注册重新选择每个成本值。这个选择过程发生在分组和聚合之前(即总和,计数)。这就是为什么你得到乘法和。

由于查询是基于中的每个表中的字段选择值,因此DISTINCTROW无效,因此它必须有效地保留原始集合中的每一行。 DISTINCTROW确实不是首先从一个表中选择行,然后从另一个表中独立地选择行(也不会将它们分开总结)。而是应用完整选择和交叉连接,然后通过询问“该行只包含来自已选源表格行的数据?”来过滤掉行。如果答案是肯定的,那么它将从最终选择中排除。但是,如果所选数据包含连接中每个表的值,则每行都是唯一的,因此不会排除任何内容。

定义一个总和:

SELECT Classes.ID As ID, 
     Sum(Costs.Amount) AS [Sum Of Amount] 
FROM Classes 
    LEFT JOIN Costs 
    ON Classes.[ID] = Costs.[Class ID] 
GROUP BY Classes.ID 

那么其他:

SELECT Classes.ID As ID, 
     Sum(Registrations.Tuition) AS [Sum Of Tuition] 
FROM Classes 
    LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID] 
GROUP BY Classes.ID 

你可以保存在访问这些查询,然后按名称引用它们在其他疑问,或者您可以包含嵌入式SQL 。在这种情况下,它只是个人偏好,但嵌入式查询不能使用可视化设计视图进行检查或编辑,而必须使用Access中的SQL视图进行编辑。

SELECT DISTINCTROW Classes.ID, Classes.Title, 
     Classes.Instructor, Classes.Date, 
     CostsAgg.[Sum Of Amount], 
     RegAggs.[Sum Of Tuition] 
FROM (Classes LEFT JOIN 
     (SELECT Classes.ID As ID, Sum(Costs.Amount) AS [Sum Of Amount] 
     FROM Classes LEFT JOIN Costs ON Classes.[ID] = Costs.[Class ID] 
     GROUP BY Classes.ID) AS CostsAgg ON Classes.ID = CostsAgg.ID) 
     LEFT JOIN 
     (SELECT Classes.ID As ID, Sum(Registrations.Tuition) AS [Sum Of Tuition] 
     FROM Classes LEFT JOIN Registrations ON Classes.[ID] = Registrations.[Class ID] 
     GROUP BY Classes.ID) AS RegAggs 
     ON Classes.ID = RegAggs.ID 
GROUP BY Classes.ID, 
     Classes.Title, 
     Classes.Instructor, 
     Classes.Date; 

我没有包含Count列,因为从示例中不清楚你真的想要计算什么。当然,您可以在任何子/查询中分别包含一个计数字段,也可以在其中包含所有这些字段以获取不同的值。

+0

C珀金斯,这工作。坦率地说,这些聚合查询正处于我的查询技能的边缘。我能够将代码转换为我的数据库的细节,并运行一个报告来准确比较两个总计。我会密切研究一段时间。谢谢。 –