簡體   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