"MySQL中的Sum(if)分組"
P粉026665919
P粉026665919 2023-09-11 13:16:22
0
1
393

我有以下未載入的表格: 付款日期, 使用者身份, 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粉026665919
P粉026665919

全部回覆(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順序對資料進行排序。

我認為這應該能滿足你的需求。

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!