Mysql 分组表上的多个和
我想对两个表中按ref分组的total列求和,因此我的输出如下所示:Mysql 分组表上的多个和,mysql,sql,group-by,sum,Mysql,Sql,Group By,Sum,我想对两个表中按ref分组的total列求和,因此我的输出如下所示: Table Header +---------+-------+ | ref | total | +---------+-------+ | 2544 | 2000 | | 2544 | 10 | | 2545 | 2566 | | 2545 | 34 | +---------+-------+ Table Items +---------+-------+ | ref
Table Header
+---------+-------+
| ref | total |
+---------+-------+
| 2544 | 2000 |
| 2544 | 10 |
| 2545 | 2566 |
| 2545 | 34 |
+---------+-------+
Table Items
+---------+-------+
| ref | total |
+---------+-------+
| 2544 | 1500 |
| 2544 | 500 |
| 2545 | 2000 |
| 2545 | 500 |
| 2545 | 100 |
+---------+-------+
然后,我可以比较两个总计列并检查差异
查询:
Output:
+---------+--------------+-------------+
| ref | total_header | total_items |
+---------+--------------+-------------+
| 2544 | 2010 | 2000 |
| 2545 | 2600 | 2600 |
+---------+--------------+-------------+
这为标题表提供了正确的信息。一旦我将Items表添加到查询中,那么total_标题和total_Items就会给出错误的值
这是我正在使用的查询
Select
Header.ref,
Sum(Header.total) as total_header
From
Header
Group By
Header.ref
Order By
Header.ref Desc
有人能帮我创建一个查询来生成上面的输出吗?此外,如果可能,还可以使用另一列比较两个总列,根据它们是否匹配,给出true或false
谢谢,
马丁。你可以先得到总数,然后加入他们-
Select
Header.ref,
Sum(Header.total) as total_header,
Sum(Items.total) as total_items
From
Header Left Join
Items On Header.ref = Items.ref
Group By
Header.ref
Order By
Header.ref Desc
你可以简单地使用
SELECT H.ref, H_TOT, I_TOT
FROM (SELECT ref, SUM(total) H_TOT
FROM Header
GROUP BY ref) H
JOIN (SELECT ref, SUM(total) I_TOT
FROM Items
GROUP BY ref) I ON H.ref = I.ref
ORDER BY H.ref
使用
联合两个表中的所有
,然后聚合:
Select ref, sum(header.total) as total_header, sum(items.total) as total_items
from header,items where header.ref = items.ref
group by ref
order by ref desc
请参阅。结果: 可能的解决办法
| ref | total_header | total_items | matching |
| ---- | ------------ | ----------- | -------- |
| 2544 | 2010 | 2000 | 0 |
| 2545 | 2600 | 2600 | 1 |
此解决方案的最佳情况是:
SELECT COUNT(*)/COUNT(DISTINCT ref)
对于这两个表都很高,~(10或更多)ref
在两个表中都被索引(另外,请在两个表的第一个子查询中尝试选择DISTINCT ref FROM
)您的查询与OPs第二次查询有什么区别。我不明白OPs查询是什么。由于交叉连接相乘,您的查询将给出错误的结果。PS.OP==原始海报,问题作者。@Akina,这不是交叉连接。他在where子句中使用连接条件。@AnkitBajpai“交叉连接相乘”是一个效果,当一个连接的值由于另一个连接的多个记录而相乘时。它与
交叉连接
连接类型无关。我承认我把这个词误译成了英语,这完全取决于我的意图。他可能使用Inner而不是LEFT。@forpas,已更新。好的,但正如我所说的,只有当每个表都有相同的不同引用时,这才有效。您应该识别每个表上的主键。谢谢,我使用了您的解决方案,因为在扩展查询时,www.db-fiddle.com被证明是一个方便的工具。Thanks@MartinTrezise你有没有理由不接受我的回答?
| ref | total_header | total_items | matching |
| ---- | ------------ | ----------- | -------- |
| 2544 | 2010 | 2000 | 0 |
| 2545 | 2600 | 2600 | 1 |
SELECT refs.ref, sum_header.header_total, sum_items.items_total
FROM ( SELECT ref FROM header
UNION
SELECT ref FROM items ) refs
LEFT JOIN ( SELECT ref, SUM(total) header_total
FROM header
GROUP BY ref ) sum_header USING (ref)
LEFT JOIN ( SELECT ref, SUM(total) items_total
FROM items
GROUP BY ref ) sum_items USING (ref)