2

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

项目表有字段

  1. 项目 ID
  2. 项目名
  3. 项目状态

发票表有字段

  1. 发票编号
  2. 项目ID(外键)
  3. 发票类型(已付款和已收到)
  4. InvoiceChannel(编码、设计和咨询)
  5. 发票金额

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

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

MS Access 中的分组问题

如何使用 SQL 查询来实现这一点?
或者我是否必须使用服务器端编码(我使用 C# 和 ASP.NET)

4

1 回答 1

2

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

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

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

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

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

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

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

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

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

SELECT ct.*, 
    Iif(IsNull(Coding), 0, Coding) +
    Iif(IsNull(Designing), 0, Designing) + 
    Iif(IsNull(Consulting), 0, Consulting) AS Total
FROM ct;
于 2012-11-21T08:39:54.280 回答