繁体   English   中英

MySQL JOIN具有多个表和SUMS

[英]MySQL JOIN with multiple tables and SUMS

我正在尝试创建一个查询,该查询将从我正在创建的计费系统的四个表中获取信息。 我有以下表格:

表发票

InvoiceID (PK)
ClientID
Date
Status
...

表客户端

ClientID (PK)
ClientName
...

表InvoiceItem

ItemID (PK)
InvoiceID
Amount
...

表付款

PaymentID (PK)
InvoiceID
Amount
...

我需要创建一个查询,我可以从Invoice表中访问信息以及客户名称,以及与发票关联的所有发票项目和付款的总和。

我尝试过以下方法:

SELECT 
    Invoice.InvoiceID, 
    Invoice.`Date`, 
    Invoice.Terms, 
    Invoice.DateDue, 
    Invoice.Status, 
    Client.ClinicName, 
    SUM(InvoiceItem.Amount), 
    SUM(Payment.PaymentAmount)
FROM Invoice
JOIN (Client, InvoiceItem, Payment) ON
    (Client.ClientID=Invoice.ClientID AND
     InvoiceItem.InvoiceID=Invoice.InvoiceID AND 
     Payment.InvoiceID=Invoice.InvoiceID)

虽然这种方法有效,但它将SUM()乘以用于得到总和的记录数(即如果有两笔付款 - 800,400 - 它给我(800 + 400)* 2 - 2400)。 我猜我有一些关于我如何使用连接,我老实说从来没有使用连接多个表,我总是使用GROUP BY,但我似乎无法让它正常工作。

更糟糕的是,过去几年我一直迷失于vb.net/MSSQL客户端编程的世界,所以我的MySQL相当粗糙。

您的问题是您无法在单个查询中一次聚合两个独立的表。 但是,您可以使用子查询来执行此操作。

SELECT Invoice.InvoiceID, Invoice.`Date`, Invoice.Terms, Invoice.DateDue, Invoice.Status, Client.ClinicName, InvoiceItemSum.SumOfAmount, PaymentSum.SumOfPaymentAmount
  FROM Invoice
  INNER JOIN Client ON Client.ClientID = Invoice.ClientID
  INNER JOIN (
    SELECT InvoiceID, SUM(Amount) AS SumOfAmount
      FROM InvoiceItem
      GROUP BY InvoiceID
  ) InvoiceItemSum ON InvoiceItemSum.InvoiceID = Invoice.InvoiceID
  INNER JOIN (
    SELECT InvoiceID, SUM(PaymentAmount) AS SumOfPaymentAmount
    FROM Payment
    GROUP BY InvoiceID
  ) PaymentSum ON PaymentSum.InvoiceID = Invoice.InvoiceID

试试这个:

SELECT
    Invoice.InvoiceID,
    Invoice.`Date`,
    Invoice.Terms,
    Invoice.DateDue,
    Invoice.Status,
    Client.ClinicName,
    SUM(InvoiceItem.Amount),
    SUM(Payment.PaymentAmount)
FROM Invoice 
JOIN Client ON Client.ClientID=Invoice.ClientID
JOIN InvoiceItem ON InvoiceItem.InvoiceID=Invoice.InvoiceID
JOIN Payment ON Payment.InvoiceID=Invoice.InvoiceID
group by 1,2,3,4,5,6;

我对你的查询做了两件事:

  1. 为每个子表创建分隔的连接
  2. 添加了一个group by ,没有该group by ,总和将无法正常工作(fyi,在所有其他数据库中,省略该组实际上会导致语法错误)

试试这个

SELECT  a.InvoiceID,
        a.`Date`,
        a.Terms,
        a.DateDue,
        a.Status,
        b.ClinicName,
        SUM(c.Amount),
        SUM(d.PaymentAmount)
FROM    Invoice a
            INNER JOIN Client b
                on a.ClientID = b.ClientID
            INNER JOIN InvoiceItem c
                ON c.InvoiceID = a.InvoiceID
            INNER JOIN JOIN Payment d
                ON d.InvoiceID = a.InvoiceID
GROUP BY    a.InvoiceID,
            a.`Date`,
            a.Terms,
            a.DateDue,
            a.Status,
            b.ClinicName

你能详细说明一下吗?

它将SUM()乘以用于得到总和的记录数(即如果有两笔付款 - 800,400 - 它给我(800 + 400)* 2 - 2400)

你还可以通过“CROSS APPLY”来实现它

SELECT Invoice.InvoiceID, Invoice.`Date`, Invoice.Terms, Invoice.DateDue, Invoice.Status, Client.ClinicName, InvoiceItemSum.SumOfAmount, PaymentSum.SumOfPaymentAmount
  FROM Invoice
  INNER JOIN Client ON Client.ClientID = Invoice.ClientID
  CROSS APPLY ( SELECT ISNULL(SUM(Amount),0) AS SumOfAmount 
                                  FROM   InvoiceItem 
                                  WHERE  InvoiceID = Invoice.InvoiceID
                                ) InvoiceItemSum 
  CROSS APPLY ( SELECT ISNULL(SUM(PaymentAmount),0) AS SumOfPaymentAmount 
                                  FROM   Payment 
                                  WHERE  InvoiceID = Invoice.InvoiceID
                                ) PaymentSum 

暂无
暂无

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

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