我有一张包含主发票数据的表格,以及两张包含发票项目的表格:
对于发票概述页面,我想通过一个查询检索所有发票及其总金额。
简化架构
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。
如果发票包含多个产品和多个小时商品,如何以一种有效的方式检索各自总金额的发票清单?
答案 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