簡體   English   中英

從多個表中為MySQL表中的每個記錄選擇SUM

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM