[英]Select SUM from multiple tables for every record in MySQL table
我有一個包含主要發票數據的表,還有兩個包含發票項目的表:
對於發票總覽頁面,我想通過一個查詢檢索所有發票及其總金額。
簡化模式
發票_主要
| invoice_id |
| 1 |
| 2 |
| 3 |
發票_物品_產品
| item_id | invoice_id | item_count | item_unit_price |
| 1 | 1 | 1 | 999.95 |
| 2 | 1 | 20 | 49.50 |
| 3 | 2 | 3 | 15.00 |
| 4 | 2 | 5 | 5.00 |
| 5 | 3 | 2 | 150.00 |
發票_項目_小時
| item_id | invoice_id | item_hours | item_hourly_rate |
| 1 | 1 | 3.50 | 90.00 |
| 2 | 1 | 1.00 | 140.00 |
| 3 | 2 | 12.00 | 90.00 |
| 4 | 3 | 1.50 | 90.00 |
借助這個問題,我構建了以下查詢:
SELECT
I.invoice_id,
IFNULL(
SUM(ROUND(P.item_unit_price * P.item_count, 2)),
0
) + IFNULL(
SUM(ROUND(H.item_hourly_rate * H.item_hours, 2)),
0
) AS invoice_total_amount
FROM
invoices_main I
LEFT JOIN invoices_items_products P ON I.invoice_id = P.invoice_id
LEFT JOIN invoices_items_hours H ON I.invoice_id = H.invoice_id
GROUP BY
I.invoice_id
它的工作原理類似,但是如果發票同時包含產品和按小時收費的商品,並且其中至少有一個同時包含多個條目,則由於聯接的原因,商品會重復,並且總金額過高。
因此,在上面的示例架構中,invoice_id 1和2出錯,但使用3。
即使發票具有多個產品和多個小時項目,如何以一種有效的方式檢索發票列表及其各自的總金額?
如注釋中所述,您應該在進行連接之前對每個表中每個invoice_id
的收入進行匯總。 如果您希望從這兩個地方獲得收入,則可以將(B.unit_revenue + C.hourly_revenue) total_revenue
到下面的第一個SELECT
語句中。
SELECT A.invoice_id, B.unit_revenue, C.hourly_revenue FROM
invoices_main AS A
JOIN (
SELECT invoice_id, SUM(item_count * item_unit_price) unit_revenue
FROM invoices_items_products GROUP BY invoice_id
) B
ON
A.invoice_id = B.invoice_id
JOIN (
SELECT invoice_id, SUM(item_hours * item_hourly_rate) hourly_revenue FROM
invoices_items_hours GROUP BY invoice_id
) C
ON
A.invoice_id = C.invoice_id
嘗試將兩個左聯接都放入子查詢中。
SELECT
I.invoice_id,
IFNULL
(
(
SELECT SUM(ROUND(H.item_hourly_rate * H.item_hours, 2))
FROM invoices_items_hours AS H
WHERE H.invoice_id = I.invoice_id
)
, 0
) +
IFNULL
(
(
SELECT SUM(ROUND(P.item_unit_price * P.item_count, 2))
FROM invoices_items_products AS P
WHERE P.invoice_id = I.invoice_id
)
, 0
) AS invoice_total_amount
FROM invoices_main AS I
GROUP BY I.invoice_id
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.