首页  >  问答  >  正文

"MySQL中的Sum(if)分组"

我有以下未加载的表格: 付款日期, 用户身份, MonthlyAmount_last30d

用户ID和付款日期来自表格。在monthlyAmount_last30d字段中,我想看到该期间的金额(付款日期-30天)。

我无法弄清楚如何正确地对这些列进行分组以获得这样的结果。如果我只按user_id分组,那么我只能看到一个第一行与付款日期(我需要所有行,每行都有该用户ID的付款总额,该总额是该行的付款日期-30天的总和)。 如果我按两个字段分组->我得到的付款金额始终等于该行的付款金额,而不是我需要的期间的实际金额。

select
order_id,
order_date,
sum( if( ( order_date <= order_date 
         and order_date >= order_date - interval 30 day), order_cost_rub, 0)) monthlyAmount_last30d,
用户身份,
order_cost_rub

from MyTable

group by
user_id

感谢任何提示!

更新:

数据示例:

user_id 付款日期 order_cost_rub
1 2022-01-01 12:00:00 100
1 2022-01-01 13:00:00 100
1 2022-01-03 20:00:00 150
2 2022-01-03 16:00:00 200
2 2022-01-15 11:00:00 300

期望的结果:

user_id 付款日期 order_cost_rub monthlyAmount_last30d
1 2022-01-01 12:00:00 100 100
1 2022-01-01 13:00:00 100 200
1 2022-01-03 20:00:00 150 350
2 2022-01-03 16:00:00 200 200
2 2022-01-15 11:00:00 300 500

P粉026665919P粉026665919428 天前432

全部回复(1)我来回复

  • P粉138871485

    P粉1388714852023-09-12 10:16:40

    我认为你在IF()中尝试的操作是错误的。我认为你所要求的应该应用在WHERE子句中,例如

    我想要所有在过去30天内发生的所有人的交易记录。从中,我想要他们所有购买的总额,并按每个人分组。听起来对吗?

    select
          user_id,
          payment_date,
          order_cost_rub,
          sum( order_cost_rub ) 
             OVER ( PARTITION BY user_id 
                    order by payment_date ) AS monthlyAmount_last30d
       from 
          MyTable
       where
          order_date >= subdate(curdate(), interval 30 day)

    通过应用查询的WHERE子句,你永远不会得到任何之前的交易记录,所以不需要在每条记录上应用IF()条件检查。

    修订后的查询。所以,你想要显示每一条记录,但是只要往回看30天。所以,WHERE子句仍然适用。但现在我展示了所有正常记录的所有列。看一下SUM()。这是在做你要求的累计总额。

    注意它后面的OVER子句(我缩进只是为了显示它与sum()过程相关的上下文)。OVER指定了分区(类似于group by,但不是普通的外部group by)。这只是意味着当这个分区值改变时重新开始。在这种情况下,是用户ID。并且通过分区内的ORDER BY指示按照payment_date顺序对数据进行排序。

    我认为这应该能满足你的需求。

    回复
    0
  • 取消回复