[英]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.