Php MySQL多表中多行的总和
我试图从两个不同的表中获取多行的总和,但结果会返回多行 我需要根据报价单id获取报价单\项目\金额组和发票\项目\金额组的总和,如果我查询未付款报价单,我需要获取SUMPOICEPhp MySQL多表中多行的总和,php,mysql,sql,Php,Mysql,Sql,我试图从两个不同的表中获取多行的总和,但结果会返回多行 我需要根据报价单id获取报价单\项目\金额组和发票\项目\金额组的总和,如果我查询未付款报价单,我需要获取SUMPOICE
table client_project_id
+-------------------+-----------+----------------------+
| client_project_id | client_id | client_project_title |
+-------------------+-----------+----------------------+
| 23 | 5 | Project 1 |
| 17 | 9 | Project 2 |
| 54 | 7 | Project 3 |
+-------------------+-----------+----------------------+
table quotation
+--------------+-------------------+------------------+
| quotation_id | client_project_id | quotation_number |
+--------------+-------------------+------------------+
| 1 | 23 | Q/01/2020/001 |
| 2 | 17 | Q/01/2020/002 |
| 3 | 54 | Q/01/2020/003 |
+--------------+-------------------+------------------+
table quotation_item
+-------------------+--------------+-----------------------+
| quotation_item_id | quotation_id | quotation_item_amount |
+-------------------+--------------+-----------------------+
| 1 | 1 | 500 |
| 2 | 1 | 700 |
| 3 | 1 | 600 |
| 4 | 2 | 200 |
| 5 | 2 | 150 |
| 6 | 3 | 900 |
+-------------------+--------------+-----------------------+
table invoice
+--------------+-------------------+------------------+
| invoice_id | client_project_id | invoice_number |
+--------------+-------------------+------------------+
| 1 | 23 | I/01/2020/001 |
| 2 | 17 | I/01/2020/002 |
| 3 | 54 | I/01/2020/003 |
+--------------+-------------------+------------------+
table invoice_item
+-------------------+--------------+-----------------------+
| invoice_item_id | invoice_id | invoice_item_amount |
+-------------------+--------------+-----------------------+
| 1 | 1 | 500 |
| 2 | 1 | 700 |
| 3 | 1 | 600 |
| 4 | 2 | 200 |
| 5 | 2 | 150 |
| 6 | 3 | 900 |
+-------------------+--------------+-----------------------+
我需要得到的结果是:
每个客户\项目\ id的报价\项目\金额和发票\项目\金额之和
查询SUMinvoiceSELECT
SUM(quotation_item.quotation_item_amount) as quot_amt,
SUM(invoice_item.invoice_item_amount) as inv_amt,
data_client_project.client_project_id,
data_client.client_name
FROM data_client_project a
LEFT JOIN quotation b ON a.client_project_id = b.client_project_id
LEFT JOIN data_client d ON a.client_id = d.client_id
LEFT JOIN invoice i ON a.client_project_id = i.client_project_id
JOIN (
SELECT quotation_id,
SUM(c.quotation_item_amount) as quot_amt
FROM quotation_item c
GROUP BY c.quotation_id
) quotitem
ON b.quotation_id = quotitem.quotation_id
JOIN (
SELECT invoice_id,
SUM(e.invoice_item_price) as inv_amt
FROM invoice_item e
GROUP BY e.invoice_id
) invitem
ON i.invoice_id = invitem.invoice_id
但是,这会导致报价单项目金额和发票项目金额的多个重复行
已尝试使用UNION/UNION ALL和其他几个不起作用的查询。
感谢您的所有建议。我可能遗漏了一些内容,但您的表说明中未包含data\u client或data\u client\u项目的示例鉴于您的示例,我希望您的行扩展来自前3个联接 确保以下内容首先为您提供了所需的数据列表,然后尝试加入计算:
SELECT *
FROM data_client_project a
LEFT JOIN quotation b ON a.client_project_id = b.client_project_id
LEFT JOIN data_client d ON a.client_id = d.client_id
LEFT JOIN invoice i ON a.client_project_id = i.client_project_id;
#you may want to append the above with a limit 100 for testing.
如果主查询中有重复的行,则只为obatin a添加不同的行 and和D根据quotitem.QUOTE“U amt
SELECT distinct a.*, b.*, d.*, i.*
FROM data_client_project a
LEFT JOIN quotation b ON a.client_project_id = b.client_project_id
LEFT JOIN data_client d ON a.client_id = d.client_id
LEFT JOIN invoice i ON a.client_project_id = i.client_project_id
JOIN (
SELECT quotation_id,
SUM(c.quotation_item_amount * c.quotation_item_qty) as quot_amt
FROM quotation_item c
GROUP BY c.quotation_id
) quotitem ON b.quotation_id = quotitem.quotation_id
JOIN (
SELECT invoice_id,
SUM(e.invoice_item_price) as inv_amt
FROM invoice_item e
GROUP BY e.invoice_id
) invitem ON i.invoice_id = invitem.invoice_id
WHERE quotitem.quot_amt < invitem.inv_amt
看起来您正试图同时沿两个不同的维度进行聚合。解决方案是沿每个维度进行预聚合:
SELECT *
FROM data_client_project cp LEFT JOIN
(SELECT q.client_project_id,
SUM(qi.quotation_item_amount * qi.quotation_item_qty) as quot_amt
FROM quotation q JOIN
quotation_item qi
ON qi.quotation_id = q.quotation_id
GROUP BY q.client_project_id
) q
USING (client_project_id) LEFT JOIN
(SELECT i.client_project_id,
SUM(invoice_item_price) as inv_amt
FROM invoice i JOIN
invoice_item ii
ON i.invoice_id = ii.invoice_id
GROUP BY i.client_project_id
) i
USING (client_project_id);
关于你的风格的两个注释
首先,您使用任意字母作为表别名。这使得查询很难理解,如果添加新表、删除表或重新排列名称,则查询会变得非常笨拙。在表格中使用缩写。更容易理解
第二,对于这样的查询,我并不推荐SELECT*。但是,如果要包含用于创建表并用数据填充的脚本,可以通过使用替换ON来避免重复的列。,或者,如果你可以在sqlfiddle.com或db-fiddle.com这样的网站上这样做,然后在你的问题中发布链接,那么其他人会更容易帮助你获得问题的答案。此外,如果您可以提供当前查询所提供的结果集示例,以及该结果集的外观示例,请确保清楚指出两者之间的差异,这将非常有帮助。请注意:以上不是完整的答案。但是试图帮助提供信息。正如Gharbad所指出的,在db-FIDLE.com中添加的示例数据会带来奇迹。感谢您的建议,但是这个返回错误:“on子句”中的未知列“qi.quote_id”,我猜这是因为第二部分?对于SELECT*就是一个示例,在实时情况下,我会特别选择我编辑的问题中的每一列,特别选择SumQuotence“U item.Quotence“U item”amount作为Quote“amt”,SUMinvoice“U item.invoice”item“amount作为inv”作为inv“amt”,data“client”project.client“project”id,data“client”client.client_name@Charas . . . 我修正了条款,谢谢你!它确实按预期工作,但是当我在末尾添加I.inv_amt>q.quot_amt时,它没有返回正确的数据,或者我是否将其放在了错误的位置?