繁体   English   中英

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

[英]Writing a grouping query in sql ( MS-Access )

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

项目表有字段

  1. 项目编号
  2. 项目名
  3. 项目状态

发票表有字段

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

Projects 表与 Invoices 表是一对多的关系,其中项目 ID 作为外键。

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

MS Access 中的分组问题

如何使用 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");

这将为您提供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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM