父母的总和和孩子的总和被重复

时间:2020-03-25 00:59:00

标签: mysql sql join group-by sum

嗨,我有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进行比较以确保。由于许多数据库调用和PHP处理,我之所以不使用旧sql的原因是它的速度非常慢。

+----------+------+-------+---------------------------------------------------------------------+
| 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

1 个答案:

答案 0 :(得分:0)

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

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