【发布时间】:2017-09-22 16:43:53
【问题描述】:
我正在尝试为所有用户创建 6 个月内按月显示订阅价格 (AmountPerMonth) 的报告 - 其中 Month1 是用户购买第一个订阅日期(不是注册日期),Month2 等是从该日期开始的后续月份,每个帐户都不同。
The format of the table for this report
我已经设法拉出前 2 个月的表格,但不知道如何继续到第 6 个月。提前谢谢!
SELECT F1.Id, F1.Month1, F2.Month2
FROM
(SELECT Id, AmountPerMonth AS Month1, ActionDate
FROM MONTLYSPEND
GROUP BY ID
HAVING MIN(ActionDate)) AS F1,
(SELECT t1.Id R, t2.AmountPerMonth AS Month2, MIN(t2.ActionDate)
FROM MONTLYSPEND t1
INNER JOIN MONTLYSPEND t2
ON t1.Id = t2.Id
AND t1.ActionDate < t2.ActionDate
GROUP BY t1.Id) AS F2
WHERE F1.id = F2.R
;
【问题讨论】:
-
请以文本格式添加您的表格结构。
-
是说表中有
Month3、Month4....Month6等列吗?如果是这样,那么设计很可能不是normalised。 -
@JenR - 我上传了一张图片; DhruvSaxena - 没错。
-
@Lya1981 这通常不是设计可伸缩表结构的最佳方式。不确定您是否最多只有 6 个月。可以想象,如果数据要超过 6 个月,表将需要有尽可能多的列来容纳它。因此,可能值得考虑按照以下几行创建一个新表:
months(user_id, payment_date, amount)。这将有助于为用户添加尽可能多的月份,从而选择所需深度的记录,而无需编写过于复杂的查询。例如:this -
@DhruvSaxena - 谢谢,是的,我已经这样做了:MONTHLYSPEND 表是我创建的视图,它正好包含这 3 个表。我尝试了不同的步骤,比如将每个用户限制为 6 个月,所以如果我按用户 ID 对它进行排序,我每个人有 6 条记录;然后我选择 Min(subscriptiondate) 作为month1 - 它很好;然后我在第二个月使用自加入,它可以工作,但它基于 date1