在 sql (MS-Access) 中编写分组查询

Posted

技术标签:

【中文标题】在 sql (MS-Access) 中编写分组查询【英文标题】:Writing a grouping query in sql ( MS-Access ) 【发布时间】:2012-11-21 07:49:42 【问题描述】:

我有两个表格项目和发票。数据库是 MS Access (mdb)

项目表有字段

    项目ID 项目名称 项目状态

发票表有字段

    发票 ID ProjectID(外键) 发票类型(已付款和已收到) InvoiceChannel(编码、设计和咨询) 发票金额

Projects 表与 Invoices 表存在一对多关系,项目 ID 作为外键。

我想要一个通过像这样查询 Invoices 表创建的表

如何使用 SQL 查询实现此目的? 还是我必须使用服务器端编码(我使用 C# 和 ASP.NET)

【问题讨论】:

【参考方案1】:

您发布的表架构没有包含总和金额的字段。我将其称为Amount

首先,创建一个交叉表查询,并将其保存在数据库中(我称之为ct):

TRANSFORM Sum(Amount) AS SumOfAmount
SELECT ProjectID, InvoiceType
FROM Invoices
GROUP BY ProjectID, InvoiceType
PIVOT InvoiceChannel In ("Coding","Designing","Consulting");

这将为您提供ProjectIDInvoiceType 作为前两列,另外还有一列用于“编码”、“设计”和“咨询”。

要获得总数,您需要另一个查询:

SELECT ct.*, Coding + Designing + Consulting AS Total
FROM ct;

请记住,如果没有特定 ProjectID/InvoiceType/InvoiceChannel 的记录,则查询将针对该组合返回 NULL,这将导致 TotalNULL .如果此查询将在 Access 下运行(例如通过 Access.Application),您可以使用 Nz 函数,其工作方式类似于 C# 中的 ?? 运算符:

SELECT ct.*, Nz(Coding,0) + Nz(Designing,0) + Nz(Consulting,0) AS Total
FROM ct;

如果您使用 OleDbProvider 通过 ADO.NET 从 .mdb.accdb 访问数据,您可能无法使用 Nz,您将不得不使用更复杂的东西:

SELECT ct.*, 
    Iif(IsNull(Coding), 0, Coding) +
    Iif(IsNull(Designing), 0, Designing) + 
    Iif(IsNull(Consulting), 0, Consulting) AS Total
FROM ct;

【讨论】:

对不起。我已经更新了问题。另外我不需要交叉表查询。我只关心查询单个表Invoices。我会试试你的方法,让你知道。谢谢... 如何从Invoices 表中以您想要的形式获取数据,而无需交叉表查询? 让我们说我拥有所有我想要计算发票的项目 ID。两个表都在不同的 mdbs 中 嗨 ZevSpitz。很好的答案,但您不需要另一个查询来获得交叉表中的总数,您还可以将值字段作为行标题求和。例如:TRANSFORM Sum(Table1.ANumber) AS SumOfANumber SELECT Table1.AText2, Sum(Table1.ANumber) AS Total FROM Table1 GROUP BY Table1.AText2 PIVOT Table1.AText;

以上是关于在 sql (MS-Access) 中编写分组查询的主要内容,如果未能解决你的问题,请参考以下文章

使用 SQL 在 Ms-access 查询中运行 Total

如何使用sql语句和vba将数据从MS-Access导入excel power查询?

如何检索 MS-Access 中的最后一个自动增量值,例如 Sql Server 中的 @@Identity

编辑器中的 ms-access VBA 长 sql 查询字符串行拆分(内联双引号)

为啥 MS-Access 中的 Teradata 查询比 SQL Server 更快

库存 SQL 查询出现歧义错误,其中两个字段应相等以进行计算。 MS-ACCESS