【问题标题】:Sum of parent and Sum of child being duplicated [duplicate]被复制的父母和孩子的总和[重复]
【发布时间】:2020-07-05 13:41:01
【问题描述】:

您好,我有 2 张桌子,我想按月分组

+-----------+----------+-------+
| Parent ID | Payments | Month |
+-----------+----------+-------+
|         1 |      100 |     1 |
|         2 |      120 |     1 |
|         3 |      130 |     2 |
+-----------+----------+-------+
+----------+------------+----------+
| Child ID | Parent Ref |     Sold |
+----------+------------+----------+
|        1 |          1 |       20 |
|        2 |          1 |       30 |
|        3 |          2 |       50 |
|        4 |          2 |       10 |
+----------+------------+----------+

预期的输出应该是

+----------+------+-------+------------------------------------------+
| Payments | Sold | Month |           Notes (no need sql)            |
+----------+------+-------+------------------------------------------+
|      220 |  110 |     1 | <-220=sum(100+120), sum(110=20+30+50+10) |
|      130 |    0 |     2 | <-130=130, null or 0 doesnt matter       |
+----------+------+-------+------------------------------------------+

我认为我的查询得到的是父级乘以它的总和。我正在使用一个实时数据库,所以不确定它是否乘以孩子的数量,但它在某处相乘。所有的孩子总和结果都很好,所有的父母都没有。我已经将此与我以前的 SQL 进行了比较以确保。我不使用旧 sql 的原因是由于许多 db 调用和 php 处理非常慢。

+----------+------+-------+---------------------------------------------------------------------+
| Payments | Sold | Month |                         Notes (no need sql)                         |
+----------+------+-------+---------------------------------------------------------------------+
|      880 |  110 |     1 | <-220=sum(100+120)*4 as there are 4 childrows, sum(110=20+30+50+10) |
|      130 |    0 |     2 | <-130=130, null or 0 doesnt matter                                  |
+----------+------+-------+---------------------------------------------------------------------+

我的查询

Select sum(parent.Payments), sum(child.Sold) 
from parent, child 
where
parent.id = child.parent_ref group by parent.month

【问题讨论】:

  • child 表不是缺少month 列吗?
  • 正要发布答案,但是太慢了...sqlfiddle.com/#!9/7645ad/4
  • 不,孩子不会有月份列,它从父母那里得到月份
  • 谢谢尼克!猜猜这真的是唯一的方法吗???? SELECT SUM(p.Payments) AS Payments, COALESCE(SUM(c.Sold),0) AS Sold, p.month FROM ( SELECT id, month, SUM(Payments) AS Payments FROM parent GROUP BY id, month) p LEFT JOIN ( SELECT parent_ref, SUM(Sold) AS Sold FROM child GROUP BY parent_ref ) c ON c.parent_ref = p.id GROUP BY p.month
  • 找到另一个答案,2 个查询然后让脚本语言完成它的工作(在我的例子中是 PHP)

标签: mysql sql join group-by sum


【解决方案1】:

我认为您需要为每个父级预先聚合子表,然后在外部查询中进行最终计算:

select
    p.month,
    sum(p.payments) payments
    coalesce(sum(c.sold), 0) sold
from parents p
left join (select parent_ref, sum(sold) sold from children group by parent_ref) c
    on c.parent_ref = p.parent_id
group by p.month

【讨论】:

    猜你喜欢
    • 2021-08-27
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-03
    • 2019-05-04
    相关资源
    最近更新 更多