【问题标题】:Writing a grouping query in sql ( MS-Access )在 sql (MS-Access) 中编写分组查询
【发布时间】:2023-03-18 18:00:01
【问题描述】:

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

项目表有字段

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

发票表有字段

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

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

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

如何使用 SQL 查询实现此目的?
还是我必须使用服务器端编码(我使用 C# 和 ASP.NET)

【问题讨论】:

    标签: asp.net sql ms-access


    【解决方案1】:

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

    【讨论】:

    • 对不起。我已经更新了问题。另外我不需要交叉表查询。我只关心查询单个表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;
    猜你喜欢
    • 2020-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多