Mysql Left Join 和 Sum 无法正确处理按月和年分组

标签 mysql join sum left-join multiple-columns

我想通过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

DEMO

关于Mysql Left Join 和 Sum 无法正确处理按月和年分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50516011/

相关文章:

php - 如何在 yii 中编写带有连接的查询?

mysql - MySQL View 上的全文索引或更正在连接表中搜索的方式

python - 添加/求和不均匀长度的两个列表或元组

MySQL 中的条件

MySQL创建外键错误150

php - 如何在mysql数据库中存储和获取精确的字符?

mysql - 检查 Sequelize 交易的状态?

mysql - 尽管有索引,查询仍然非常慢

php - 使用Mysql和php对多列求和

php - "vertical"数组子元素总和的 native 函数,如 vertical_sum($array[$day_of_year] ["income"]);