我有两个表项目和发票。数据库是 MS Access ( mdb )
项目表有字段
- 项目 ID
- 项目名
- 项目状态
发票表有字段
- 发票编号
- 项目ID(外键)
- 发票类型(已付款和已收到)
- InvoiceChannel(编码、设计和咨询)
- 发票金额
Projects 表与 Invoices 表存在一对多关系,项目 ID 作为外键。
我想要一个通过像这样查询 Invoices 表创建的表
如何使用 SQL 查询来实现这一点?
或者我是否必须使用服务器端编码(我使用 C# 和 ASP.NET)
您发布的表架构没有包含总计金额的字段。我将其称为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;