在 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");
这将为您提供ProjectID
和InvoiceType
作为前两列,另外还有一列用于“编码”、“设计”和“咨询”。
要获得总数,您需要另一个查询:
SELECT ct.*, Coding + Designing + Consulting AS Total
FROM ct;
请记住,如果没有特定 ProjectID
/InvoiceType
/InvoiceChannel
的记录,则查询将针对该组合返回 NULL
,这将导致 Total
为 NULL
.如果此查询将在 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 查询字符串行拆分(内联双引号)