MySQL - 用户在初始订阅购买的前 6 个月内的每月支出

标签 mysql loops date

我正在尝试创建报告,显示所有用户 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
;

最佳答案

结果有两种方法 - 存储过程,它占用太多内存,或者使用 CASE WHEN,这也可以旋转表。希望它对需要生成在 x 轴上逐日或逐月显示每个用户的各种事件的报告的人们有用。我遇到的主要困难是 Month_1(首次购买的订阅)对于每个用户来说都是不同的日期。此报告可用于分析您的用户在订阅后前 6 个月内的行为。
此查询生成的报告如下所示:

+--------+----------+------------------+---------+---------+--------+
| UserId | Currency | FirstSubscrPurch | Month_1 | Month_2 | etc... |
+--------+----------+------------------+---------+---------+--------+
| 123    |   GBP    |  2010-05-27      |  34.00  |  27.00  |  0.00  |
+--------+----------+------------------+---------+---------+--------+

SELECT F6.USERID, F6.Currency, DATE_FORMAT(F6.FirstSubscrPurch, "%Y-%m-%d") AS FirstSubscrPurch, F6.MONTH_1, F6.MONTH_2,F6.MONTH_3, F6.MONTH_4, F6.MONTH_5, F6.MONTH_6, ROUND(((F6.MONTH_1+F6.MONTH_2+F6.MONTH_3+F6.MONTH_4+F6.MONTH_5+F6.MONTH_6)/6),2) AVERAGE, F6.CURRENCY

FROM (
    SELECT
        UserId, Currency, FirstSubscrPurch,
        SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 0 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_1,
        SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 1 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_2,
        SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 2 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_3,
        SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 3 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_4,
        SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 4 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_5,
        SUM(CASE WHEN YEAR_AND_MONTH_INDEX = 5 THEN TOTAL_AMOUNT_PAID ELSE 0 END) MONTH_6

        FROM (
            SELECT
                hp.UserId, hp.Currency, MIN(hp.Date) AS FirstSubscrPurch,
                CONCAT(YEAR(Date),'-',MONTH(Date)) AS YEAR_AND_MONTH,
                TIMESTAMPDIFF( MONTH, CONCAT(YEAR(FIRST_PAYMENT_DATE),'-',MONTH(FIRST_PAYMENT_DATE),'-1'), CONCAT(YEAR(Date),'-',MONTH(Date),'-1')) AS YEAR_AND_MONTH_INDEX, -- generates string in format YYYY-M-D
                MIN(Date) FIRST_PAYMENT_OF_MONTH, 
                MAX(Date) LAST_PAYMENT_OF_MONTH, 
                COUNT(*) NUM_PAYMENTS,
                SUM(hp.Amount) TOTAL_AMOUNT_PAID, 
                SUM(hp.Credits) Credits
                FROM payments hp
                JOIN (
                    SELECT UserId, MIN(Date) FIRST_PAYMENT_DATE, ADDDATE(MIN(Date), INTERVAL 6 MONTH) SIX_MONTHS_AFTER_FIRST_PAYMENT
                    FROM payments hp 
                    GROUP BY UserId
                    ) USER_MIN_ID ON USER_MIN_ID.UserId = hp.UserId 
                    AND hp.Date BETWEEN FIRST_PAYMENT_DATE AND CONCAT(YEAR(SIX_MONTHS_AFTER_FIRST_PAYMENT),'-',MONTH(SIX_MONTHS_AFTER_FIRST_PAYMENT),'-1')
                    GROUP BY UserId, Currency, YEAR_AND_MONTH
                ORDER BY hp.UserId, hp.Date
            ) F
        GROUP BY UserId, Currency
ORDER BY UserId DESC) F6;

关于MySQL - 用户在初始订阅购买的前 6 个月内的每月支出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43614554/

相关文章:

excel - 如何在excel VBA中获得天数的差异?

mysql - 选择时增加列

用于分组依据/排序依据的 MySQL 索引

c - 打开/关闭文本文件以每 0.01 秒写入一次是正确的选择吗?

linux - 如何以编程方式修改文件日期?

mysql - 如何结合 Date_format 和 Date_sub

MySQL - 分区所需的主键

python - 无法插入mysql数据库

jQuery 循环遍历 data() 对象

java - 循环不会中断并且始终显示无效输入