我想知道给定下表结构的每个新用户的0-30天收入。希望在过去30天内排除任何收入。
Table A
有两个属性:id
和createdate
。这是用户表,每个新用户都可以在其创建的位置放入此处。
Table B
有三个属性:userid
,revenue
和orderdate
。此表记录订单日期发生的每个订单。
我对SQL的了解真的很生疏,所以我能想到的唯一方法就是使用循环。但是,如果我记得我的数据库类中的任何内容,那就是永远不要使用循环。你们都在想什么?
答案 0 :(得分:2)
您需要查看特定数据库中的datetime语法,但在MySQL中:
SELECT SUM(revenue) as month_revenue
FROM b
WHERE orderdate > (CURDATE() - INTERVAL 30 DAYS)
[编辑]
这仅适用于单个用户,使用表b。要对两个表格进行完整的查询,我们会更加异国情调。
SELECT a.id as userid, SUM(b.revenue) as revenue
FROM a
INNER JOIN b on a.id = b.userid
WHERE orderdate > (CURDATE() - INTERVAL 30 DAYS)
GROUP BY a.id
我们正在对这两个表进行连接,因此我们得到一个结构为(id, createdate, userid, revenue, orderdate)
的虚拟表,并为 b 中的每个条目创建一条记录。除了指出它在那里之外,WHERE是自我解释的。 GROUP BY将它们分成不同的用户ID,并且总和适用于这些组。
答案 1 :(得分:2)
尝试:
select a.id, sum(b.revenue) `0-30 days revenue`
from a
left join b on a.id = b.userid and
b.orderdate <= date_add(a.createdate, interval 30 day)
group by a.id
答案 2 :(得分:0)
这可以在没有循环的情况下轻松完成:
SELECT a.id AS userid,
SUM(b.revenue) AS revenue
FROM a
LEFT JOIN b
ON a.id = b.userid
WHERE (b.orderdate - a.createdate) < 2592000
OR (b.orderdate - a.createdate) IS NULL
GROUP BY a.id
2592000是30天的秒 - 我假设您使用unix时间戳作为日期字段。