Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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
Sql 如果表格较大,如何按组计算数字之和_Sql - Fatal编程技术网

Sql 如果表格较大,如何按组计算数字之和

Sql 如果表格较大,如何按组计算数字之和,sql,Sql,我想把一家人花的钱加起来 我有两张桌子 成员表(成员id、费用) 家庭表(家庭id、成员id、家庭花费的金额) 家庭与成员的关系,一个家庭有许多成员,但一个成员属于一个家庭 我想获得家庭身份证,并按金额排序 两个表都非常大,成员表是两倍大。我应该如何将数字和分组方式相加才能更快?我认为在这里选择分组方式是明智的选择,但是,没有太多的优化空间: SELECT h.household_id, COALESCE(SUM(m.money_spend), 0) AS total F

我想把一家人花的钱加起来

我有两张桌子

  • 成员表(成员id、费用)
  • 家庭表(家庭id、成员id、家庭花费的金额)
    • 家庭与成员的关系,一个家庭有许多成员,但一个成员属于一个家庭
我想获得家庭身份证,并按金额排序


两个表都非常大,成员表是两倍大。我应该如何将数字和分组方式相加才能更快?

我认为在这里选择分组方式是明智的选择,但是,没有太多的优化空间:

SELECT
    h.household_id,
    COALESCE(SUM(m.money_spend), 0) AS total
FROM Household h
LEFT JOIN Member m
    ON h.member_id = m.member_id
GROUP BY
    h.household_id;
我真的不想输入那个查询,但我这样做只是为了指出聚合确实需要潜在地触及
家庭
成员
表中的每个记录。其原因是,在我们统计每个成员以及每个成员的记录之前,我们不知道一个家庭的总开支


因为我们正在从
househouse
执行左联接,所以我们正在扫描此表,
member\u id
join列上的索引应该不会有太大区别。类似地,
member\u id
可能是
member
表中的主键,并被索引。因此,我不希望索引有助于连接,而且索引在聚合中也不会有太大的差别。

通常,您需要简单的
左连接,并进行分组和求和

select h.household_id, coalesce(sum(m.money_spend),0) as sum_of_money_spent
from household h
left join member m on h.member_id = m.member_id
group by h.household_id
不过,如果家庭成员很多,但每个成员只有一个家庭,请通读您的关系描述我们有1:N关系,您应该在
成员
表中保留
家庭id

如果我理解正确的话,您似乎已经实现了与关联实体之间的N:N关系,并且还有一个表实际上保存了每个家庭的信息


请注意,使用适当的数据体系结构,您可以在一个表中获得所需的所有信息,并且不需要额外的联接,除非您想提取每个家庭的一些详细信息,例如他们的地址。

我删除了不兼容的数据库标记。像你这样有声望的人应该知道不要在问题上贴上不相关的标签。仅使用实际使用的数据库进行标记。此外,示例数据和期望的结果将帮助其他人理解这个问题。
mysql
sqlserver
postgresql
sqlite
???你在这里显然很困惑,这些都是完全不同的产品。您有足够的声誉,知道如何正确标记。:)每个成员id是否有多行?有多少行是大的?