Rumah  >  Soal Jawab  >  teks badan

"Jumlah (jika) kumpulan dalam MySQL"

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粉026665919P粉026665919428 hari yang lalu430

membalas semua(1)saya akan balas

  • P粉138871485

    P粉1388714852023-09-12 10:16:40

    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.

    balas
    0
  • Batalbalas