您发布的表架构没有包含总和金额的字段。我将其称为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;