„Sum(if)-Gruppierung in MySQL'
P粉026665919
P粉026665919 2023-09-11 13:16:22
0
1
474

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粉026665919
P粉026665919

Antworte allen(1)
P粉138871485

我认为你在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顺序对数据进行排序。

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

Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage