"Jumlah (jika) kumpulan dalam MySQL"
P粉026665919
P粉026665919 2023-09-11 13:16:22
0
1
441

Saya mempunyai jadual berikut yang tidak dimuatkan: tarikh pembayaran, ID Pengguna, Amaun Bulanan_30h terakhir

ID pengguna dan tarikh pembayaran datang dari jadual. Dalam monthlyAmount_last30d字段 saya ingin melihat jumlah untuk tempoh (tarikh pembayaran - 30 hari).

Saya tidak dapat memikirkan cara mengumpulkan lajur ini dengan betul untuk mendapatkan hasil seperti ini. Jika saya hanya mengumpulkan mengikut user_id maka saya hanya melihat baris pertama dengan tarikh pembayaran (saya memerlukan semua baris, setiap satu dengan jumlah pembayaran untuk id pengguna itu yang merupakan tarikh pembayaran untuk baris itu - jumlah 30 hari ). Jika saya mengumpulkan mengikut kedua-dua medan -> amaun bayaran yang saya dapat sentiasa sama dengan amaun pembayaran untuk baris tersebut dan bukan amaun sebenar untuk tempoh yang saya perlukan.

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

Terima kasih atas sebarang petua!

Kemas kini:

Contoh data:

user_id Tarikh Pembayaran kos_pesanan_gosok
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

Hasil yang dijangkakan:

user_id Tarikh Pembayaran kos_pesanan_gosok Jumlah bulanan_terakhir30h
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

membalas semua(1)
P粉138871485

Saya rasa apa yang anda cuba dalam IF() adalah salah. Saya rasa apa yang anda minta harus digunakan dalam klausa WHERE seperti

Saya mahu semua rekod transaksi untuk semua orang yang berlaku dalam 30 hari yang lalu. Daripada itu, saya mahukan jumlah semua pembelian mereka, dikumpulkan mengikut setiap orang. Bunyi betul?

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)

Dengan menggunakan klausa WHERE pertanyaan, anda tidak akan mendapat sebarang rekod transaksi sebelumnya, jadi anda tidak perlu menggunakan semakan bersyarat IF() pada setiap rekod.

Pertanyaan yang disemak. Jadi, anda ingin menunjukkan setiap rekod, tetapi hanya melihat ke belakang 30 hari. Jadi, klausa WHERE masih terpakai. Tetapi sekarang saya menunjukkan semua lajur untuk semua rekod biasa. Lihatlah SUM(). Ini melakukan jumlah kumulatif yang anda minta.

Perhatikan klausa OVER selepasnya (saya mengesotkannya hanya untuk menunjukkan konteksnya berbanding prosedur sum()). OVER menentukan pembahagian (serupa dengan kumpulan mengikut, tetapi bukan kumpulan luaran biasa oleh). Ini bermakna dimulakan semula apabila nilai partition ini berubah. Dalam kes ini, ia adalah ID pengguna. Dan data diisih mengikut urutan pembayaran_tarikh melalui arahan ORDER BY dalam partition.

Saya rasa ini sepatutnya memenuhi keperluan anda.

Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan