0

現在、aMember を使用して WordPress サイトの支払いを管理し、ペイウォールを適用するサイトに取り組んでいます。私はそれをセットアップした管理者ではありませんでした。私はまだ彼らのデータベースの使い方を学んでいます。さらに、私の SQL-fu は弱いです。私はトレーニングを受けたエンジニアではありませんが、組織内で SQL をまったく知っているのは私だけです。

私の CFO は、新規登録数を 2 年前までさかのぼって日別に分類したレポートを求めています。私の知る限り、aMember はこれを簡単に分析していません。それが持っているのは、これまでに受け取ったすべての支払いの完全な記録です。

この支払い記録を日付ごとに簡単に分類して、特定の日に受け取った支払いの数を確認できます。問題は、これらの支払いの多くが既存のユーザーからのものであることです。さらに、購読、キャンセル、再購読したユーザーもいます。これは「完全な失効」と見なされるため、しきい値は 30 日です。そのため、[date] から 30 日以内に有効期限が切れた支払いがあるユーザーによる [date] の支払いは無視したいと考えています。

例: John Smith は 2012 年 12 月 1 日に登録しました。John Smith の最後の支払いは 2013 年 1 月 1 日に期限切れになりました。ジョンのアカウントは更新されません。John は 2013 年 1 月 5 日に再登録しました。ジョンの支払いは、2012 年 12 月 1 日に「新規」としてカウントされる必要がありますが (彼には以前の支払いが記録されていないため)、2013 年 1 月 5 日にはカウントされません (彼の支払いは 30 日以内の 1 月 1 日に期限切れになるため)。 1/5の支払い)。

スキーマは以下のとおりです。既存のメンバーの更新を除外せず、受け取った支払いの数のみである現在のクエリは次のとおりです。追加情報が必要な場合、または誰かがメンバーについて私以外の知識を持っている場合は、回答を容易にするために他に提供できることをお知らせください。私は頭がいっぱいで、最善を尽くしています!

SELECT begin_date, COUNT( payment_id ) 
FROM  [foo] 
WHERE amount >0
GROUP BY begin_date
ORDER BY begin_date DESC 

payment_id
member_id
product_id
begin_date
expire_date
paysys_id
receipt_id
amount
completed
remote_addr
data 
time
4

1 に答える 1

2

これでいけると思います。少し調整が必要かもしれません。amount > 0 が何をするのか正確にはわかりませんが、サブクエリにも含まれています。

適切なテストデータに対して実行して、正しい結果が得られることを確認することは、おそらく良い考えです。

SELECT begin_date, COUNT( payment_id ) 
FROM  [foo] f1
WHERE amount > 0
AND 
-- don't count it if there's another subscription from this member that expires between the 30 days previous to this one and the end of this one.
(select count(expire_date) from [foo] f2 where f1.member_id = f2.member_id and 
    f2.expire_date BETWEEN DATE_ADD(f1.begin_date, INTERVAL -30 day) and f1.expire_date 
    and f1.payment_id <> f2.payment_id and amount > 0) = 0
GROUP BY begin_date
ORDER BY begin_date DESC 
于 2013-02-06T06:16:33.793 に答える