从MySQL表中的每个记录的多个表中选择SUM

时间:2016-04-20 16:15:19

标签: mysql

我有一张包含主发票数据的表格,以及两张包含发票项目的表格:

  • 基于每小时工作,小时费率和小时数的项目
  • 产品的项目,单位数量单位价格

对于发票概述页面,我想通过一个查询检索所有发票及其总金额。

简化架构

invoices_main

n^2/4

invoices_items_products

|  invoice_id  |  
|  1           |
|  2           |
|  3           |

invoices_items_hourly

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

this问题的帮助下,我构建了以下查询:

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

它的工作方式有点,但如果发票同时包含产品和每小时商品,并且两者中至少有多个条目,则由于连接而重复项目,并且总金额变得过高。

因此,在上面的示例模式中,invoice_id 1和2出错,但使用3。

如果发票包含多个产品和多个小时商品,如何以一种有效的方式检索各自总金额的发票清单?

2 个答案:

答案 0 :(得分:0)

正如评论中所提到的,在进行加入之前,您应该按照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

答案 1 :(得分:0)

尝试将左连接放入子查询中。

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