[英]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;
我對你的查詢做了兩件事:
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.