首頁  >  問答  >  主體

"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

期望的結果:

12022-01-01 12:00:0010010012022-01-01 13:00:0010020012022-01-03 20:00:0015035022022-01-03 16:00:0020020022022-01-15 11:00:00300500
user_id 付款日期 order_cost_rub monthlyAmount_last30d

###
P粉026665919P粉026665919380 天前384

全部回覆(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
  • 取消回覆