0

我目前正在使用 aMember 来管理 WordPress 网站的付款,以强制实施付费墙。我不是设置它的管理员,我仍在学习他们的数据库。另外,我的 SQL-fu 很弱;我不是受过培训的工程师,但我是组织中唯一一个完全了解任何 SQL 的人。

我的 CFO 想要一份报告,按天细分新注册的数量,可以追溯到两年前。据我所知,aMember 没有对此进行简单的细分。它所拥有的是我们收到的每一笔付款的完整记录。

我可以轻松地按日期分解此付款记录,以查看我们在给定日期收到了多少付款。问题是,其中许多付款来自现有用户。此外,我们还有订阅、取消和重新订阅的用户。我们的门槛是 30 天,因为我们认为这是“完全失效”。因此,我们希望忽略在 [日期] 30 天内付款已过期的用户在 [日期] 支付的任何款项。

示例:John Smith 于 2012 年 12 月 1 日订阅。John Smith 的最后一笔付款于 2013 年 1 月 1 日到期。约翰的帐户没有更新。约翰于 2013 年 1 月 5 日重新订阅。约翰的付款应在 2012 年 12 月 1 日算作“新”付款(因为他之前没有记录在案),但不是在 2013 年 1 月 5 日(因为他的付款在 1 月 1 日到期,在 30 天内) 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 回答