我想通过mysql
上的月份和年份分组获得total_amount和received_amt的总和。
但我面临一个问题。
问题是第二个表列总和按月和年分组不正确。
当前查询
SELECT t1.order_date,sum(IFNULL(t1.received_amt, 0)) as SumOfNO,
sum(IFNULL(t2.total_amount, 0)) as SumOfSM,
SUM(IFNULL(t1.received_amt, 0) + IFNULL(t2.total_amount, 0)) AS Total
FROM `new_order` t1
LEFT JOIN
( select t2.sell_date,t2.total_amount, sum(total_amount) as Amount
from sell_master t2
group by YEAR(t2.sell_date), MONTH(t2.sell_date)
) t2
ON format(t1.order_date,'yyyy-MM') = format(t2.sell_date,'yyyy-MM')
GROUP BY YEAR(t1.order_date), MONTH(t1.order_date)
ORDER BY t1.order_date DESC
示例:
第一个表:new_order
第二个表:sell_master
表结构:
new_order
+----------------------------------------+
|order_date(date) | received_amt(double) |
+----------------------------------------+
|2007-10-06 | 245 |
|2007-10-06 | 310 |
|2007-10-06 | 275 |
|2007-10-06 | 300 |
+----------------------------------------+
sell_master
+----------------------------------------+
|sell_date(date) | total_amount(double) |
+----------------------------------------+
|2007-10-06 | 10 |
+----------------------------------------+
当前结果
+---------------------------------------+
|order_date | SumOfNO | SumOfSM | Total |
+---------------------------------------+
|2007-10-06 | 1130 | 40 |1170 |
+---------------------------------------+
预期结果
+---------------------------------------+
|order_date | SumOfNO | SumOfSM | Total |
+---------------------------------------+
|2007-10-06 | 1130 | 10 |1140 |
+---------------------------------------+
最佳答案
您不应在主查询中使用SUM(t2.total_amount)
。您已经在子查询中计算了总和,您应该使用它。发生的情况是,您将 t2.total_amount
乘以 new_order
中匹配的行数。
也无需在 SUM()
中使用 IFNULL()
,因为 SUM()
会忽略 null 值(大多数聚合函数都会忽略空值) )。
子查询应选择日期的年份和月份,以便您可以加入这些目录,而不是使用date_format
。
由于您是按月分组,因此您不应该选择 t1.order_date
——这只会从组中随机选择一个月中的某一天。您应该只以 YYYY-MM
格式显示月份。
SELECT
DATE_FORMAT(t1.order_date, '%Y-%m') AS month,
sum(t1.received_amt) as SumOfNO,
IFNULL(t2.Amount, 0) as SumOfSM,
sum(t1.received_amt) + IFNULL(t2.Amount, 0) AS Total
FROM `new_order` t1
LEFT JOIN
( select YEAR(t2.sell_date) AS year, MONTH(t2.sell_date) AS month, sum(total_amount) as Amount
from sell_master t2
group by year, month
) t2
ON YEAR(t1.order_date) = t2.year AND MONTH(t1.order_date) = month
GROUP BY month
ORDER BY month DESC
关于Mysql Left Join 和 Sum 无法正确处理按月和年分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516011/