Как узнать количество доходов на пользователя с начальной датой за определенное количество дней? - PullRequest
0 голосов
/ 08 сентября 2018

Допустим, у вас есть таблица пользователей с датой регистрации. И еще одна таблица с их выручкой Как мы можем рассчитать сумму дохода, скажем, за 6 или 9 месяцев для каждого участника с момента его регистрации с помощью команды mySQL?

В таблице 1 есть 2 столбца: 1. идентификатор_пользователя 2. date_of_join В таблице 2 есть 4 столбца: 1. идентификатор_покупки 2. идентификатор_пользователя 3. номер_покупки 4. дата_закупки.

Я бы хотел сделать что-то подобное

SELECT Users.user_id, AVG(Purchases.purchase_amount)
FROM Users
INNER JOIN Purchases
WHERE MONTH(Users.date_of_join) = 06
AND AVG(Purchases.purchase_amount) BETWEEN Users.date_of_join AND DATE_ADD(date_of_join, INTERVAL 30);

Ответы [ 2 ]

0 голосов
/ 09 сентября 2018

При этом будут выбраны все покупки за 6 месяцев с даты регистрации пользователя с идентификатором 5

.
SELECT p.*
FROM Purchases p
INNER JOIN Users u ON u.id=p.user_id
WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 6 MONTH) AND u.id=5;

Выбор среднего тогда тривиален

SELECT AVG(p.purchase_amount)
FROM Purchases p
INNER JOIN Users u ON u.id=p.user_id
WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 6 MONTH) AND u.id=5;

Если вы хотите, чтобы все интервалы были отдельными столбцами, то это становится немного сложнее, но все еще довольно просто.

SELECT avg_3.amount as avg_3, avg_6.amount as avg_6, avg_9.amount as avg_9
FROM Users u

INNER JOIN (
    SELECT AVG(p.purchase_amount) amount, p.user_id
    FROM Purchases p
    INNER JOIN Users u ON u.id=p.user_id
    WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 3 MONTH)
    GROUP BY p.user_id
) as avg_3 ON u.id=avg_3.user_id

INNER JOIN (
    SELECT AVG(p.purchase_amount) amount, p.user_id
    FROM Purchases p
    INNER JOIN Users u ON u.id=p.user_id
    WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 6 MONTH)
    GROUP BY p.user_id
) as avg_6 ON u.id=avg_6.user_id

INNER JOIN (
    SELECT AVG(p.purchase_amount) amount, p.user_id
    FROM Purchases p
    INNER JOIN Users u ON u.id=p.user_id
    WHERE p.purchase_date BETWEEN u.date_of_join AND DATE_ADD(u.date_of_join, INTERVAL 9 MONTH)
    GROUP BY p.user_id
) as avg_9 ON u.id=avg_9.user_id

WHERE u.id=5;
0 голосов
/ 09 сентября 2018

Вам нужен общий доход или средний доход с покупки?

Если вам просто нужно общее количество, тогда вы можете попробовать что-то вроде этого -

SELECT U.USER_ID, SUM(PURCHASES.PURCHASE_AMOUNT)
  FROM USERS U
 INNER JOIN PURCHASES P
    ON U.USER_ID = P.USER_ID
 WHERE P.PURCHASE_DATE >= U.DATE_OF_JOIN
   AND P.PURCHASE_DATE < DATE_ADD(U.DATE_OF_JOIN, INTERVAL 6 MONTH)
 GROUP BY U.USER_ID;

В среднем просто замените SUM на AVG

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...