ホームページ  >  に質問  >  本文

「MySQL での Sum(if) グループ化」

次のテーブルがありますが、読み込まれていません: 支払期日、 ユーザーID、 MonthlyAmount_last30d

ユーザー ID と支払い日はテーブルから取得されます。 monthlyAmount_last30d フィールド で、期間 (支払日 - 30 日) の金額を確認したいと思います。

これらの列を正しくグループ化してこのような結果を得る方法がわかりません。 user_id だけでグループ化した場合、支払い日を含む最初の行のみが表示されます (すべての行が必要です。各行にはそのユーザー ID の支払い合計があり、合計はその行の日付の支払いです) - 30 日の合計)。 両方のフィールドでグループ化した場合 -> 取得する支払い金額は常にその行の支払い金額と等しく、必要な期間の実際の金額ではありません。

リーリー

ヒントをありがとう!

更新:

データ例:

###ユーザーID### ###支払期日### 12022-01-01 12:00:002022-01-01 13:00:002022-01-03 20:00:002022-01-03 16:00:002022-01-15 11:00:00 ###ユーザーID### ###支払期日###
order_cost_rub
100 1
100 1
150 2
200 2
300 ###予想された結果: ###
order_cost_rub

monthlyAmount_last30d100
P粉026665919P粉026665919380日前385

全員に返信(1)返信します

  • P粉138871485

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

    IF() で試していることは間違っていると思います。あなたが求めているものは、

    のようなWHERE句に適用されるべきだと思います

    過去 30 日以内に発生した全員のすべての取引記録が必要です。そこから、各人ごとにグループ化されたすべての購入の合計が必要になります。そうでしょう?

    リーリー

    クエリの WHERE 句を適用すると、以前のトランザクション レコードが取得されないため、各レコードに IF() 条件チェックを適用する必要がありません。

    クエリを修正しました。したがって、すべてのレコードを表示したいとしますが、過去 30 日間だけを振り返る必要があります。したがって、WHERE 句は引き続き適用されます。ただし、現在はすべての通常のレコードのすべての列を表示しています。 SUM() を見てみましょう。これにより、要求した累積合計が計算されます。

    その後の OVER 句に注意してください (sum() プロシージャに関連するコンテキストを示すためだけにインデントしています)。 OVER はパーティショニングを指定します (group by に似ていますが、通常の外部 group by ではありません)。これは単に、このパーティション値が変更されたときに再起動することを意味します。この場合、それはユーザー ID です。そして、データはパーティション内の ORDER BY 命令によってpayment_date 順に並べ替えられます。

    これはあなたのニーズを満たすはずだと思います。

    返事
    0
  • キャンセル返事
  • 1 2022-01-01 12:00:00 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