Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 分组表上的多个和_Mysql_Sql_Group By_Sum - Fatal编程技术网

Mysql 分组表上的多个和

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

我想对两个表中按ref分组的total列求和,因此我的输出如下所示:

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)