Heim  >  Fragen und Antworten  >  Hauptteil

„Sum(if)-Gruppierung in MySQL“

Ich habe die folgende Tabelle, die nicht geladen wird: Zahlungsdatum, Benutzer-ID, MonthlyAmount_last30d

Benutzer-ID und Zahlungsdatum stammen aus der Tabelle. In monthlyAmount_last30d字段 möchte ich den Betrag für den Zeitraum sehen (Zahlungsdatum – 30 Tage).

Ich weiß nicht, wie ich diese Spalten richtig gruppieren soll, um ein Ergebnis wie dieses zu erhalten. Wenn ich nur nach user_id gruppiere, sehe ich nur eine erste Zeile mit dem Zahlungsdatum (ich brauche alle Zeilen, jede mit der Zahlungssumme für diese Benutzer-ID, die das Zahlungsdatum für diese Zeile ist – die Summe von 30 Tagen). Wenn ich nach beiden Feldern gruppiere -> entspricht der Zahlungsbetrag, den ich erhalte, immer dem Zahlungsbetrag für diese Zeile und nicht dem tatsächlichen Betrag für den von mir benötigten Zeitraum.

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

Vielen Dank für jeden Tipp!

Update:

Datenbeispiel:

Benutzer-ID Zahlungsdatum 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

Erwartete Ergebnisse:

Benutzer-ID Zahlungsdatum 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 Tage vor431

Antworte allen(1)Ich werde antworten

  • 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顺序对数据进行排序。

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

    Antwort
    0
  • StornierenAntwort