我目前正在开发一个网站,该网站使用会员来管理WordPress网站的付款,以强制执行付费专区。我不是设置它的管理员,我仍在学习他的数据库。另外,我的SQL-fu很弱;我不是受过培训的工程师,但我是组织中唯一一个知道任何SQL的人。
我的首席财务官想要一份报告,按日分解新注册的数量,可追溯到两年。据我所知,aMember没有简单的细分。它所拥有的是我们收到的每笔付款的完整记录。
我可以轻松按日期细分此付款记录,以查看我们在指定日期获得的付款金额。问题是,其中许多付款来自现有用户。此外,我们的用户已订阅,取消,然后重新订阅。我们的门槛是30天,因为我们认为是“完全失效”。因此,我们希望忽略付款已于[日期] 30天内到期的用户在[日期]支付的任何款项。
示例:John Smith于12/1/2012订阅。约翰史密斯的最后一笔付款于2013年1月1日到期。约翰的帐户不续订。约翰于2013年5月1日重新订阅。约翰的付款应该在2012年12月12日被计为“新”(因为他没有事先付款),但不是在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
答案 0 :(得分:2)
我认为这样做会。可能需要一些调整。我不确定完全金额> 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