ORACLE SQL - Как узнать количество покупок, сделанных до, во время и после месяца рождения? - PullRequest
0 голосов
/ 30 января 2020

Я хотел бы узнать количество покупок, совершенных за месяц до и после дня рождения клиента.

Например, День рождения клиента А в июне. Хотелось бы узнать, сколько покупок он совершил в мае, июне и июле.

У меня есть 2 существующие таблицы, которые выглядят следующим образом:

ТАБЛИЦА ИСТОРИИ ПОКУПКИ:

CUSTOMER_ID        PURCHASE_DATE
1                  2019-06-18
1                  2019-05-23
1                  2019-04-19
1                  2019-04-01
2                  2019-03-10
2                  2019-02-28
2                  2018-02-11
2                  2018-02-02

Note: This table only contains transaction history. Dates without purchases are not recorded.

ТАБЛИЦА ДЕТАЛЕЙ КЛИЕНТА:

CUSTOMER_ID        DATE_OF_BIRTH
1                  1996-05-22
2                  1990-03-07

Как результат должен выглядеть следующим образом:

CUSTOMER_ID          BDAY_MONTH       PURCHASE_B4_BDAY        PURCHASE_BDAY       PURCHASE_AFTER_BDAY
1                    5                2                       1                   1
2                    3                1                       1                   0

where PURCHASE_B4_BDAY = number of purchases made 1 month before birthday month
and   PURCHASE_BDAY = number of purchases made during birthday month
and   PURCHASE_AFTER_BDAY = number of purchases made 1 month after birthday month

Примечание. Я хочу принять во внимание только последний год покупки. Например, идентификатор клиента 2 имеет 1 покупку в феврале 19 и 2 покупки в феврале 18, однако следует учитывать только те, которые были сделаны в феврале 19.

Сообщите мне, если вам требуется дополнительная информация Спасибо большое за помощь !!!

1 Ответ

2 голосов
/ 30 января 2020

Вам необходимо найти разницу в месяцах между покупкой и датой рождения и использовать функцию MOD, чтобы вычислить, совершена ли покупка за месяц до или в точный месяц или через месяц после рождения, следующим образом:

SELECT
    CUSTOMER_ID,
    EXTRACT(MONTH FROM DATE_OF_BIRTH),
    SUM(CASE WHEN MONTHS_ = 11 THEN 1 END) AS PURCHASE_B4_BDAY,
    SUM(CASE WHEN MONTHS_ = 0 THEN 1 END) AS PURCHASE_BDAY,
    SUM(CASE WHEN MONTHS_ = 1 THEN 1 END) AS PURCHASE_AFTER_BDAY
FROM
    (
        SELECT
            CD.CUSTOMER_ID,
            MOD(MONTHS_BETWEEN(TRUNC(PH.PURCHASE_DATE, 'MONTH'), 
                               TRUNC(CD.DATE_OF_BIRTH, 'MONTH')), 12) AS MONTHS_,
            PH.PURCHASE_DATE,
            CD.DATE_OF_BIRTH
        FROM
            PURCHASE_HISTORY PH
            JOIN CUSTOMER_DETAILS CD ON PH.CUSTOMER_ID = CD.CUSTOMER_ID
    )
WHERE MONTHS_ IN(1, 0, 11) 
GROUP BY CD.CUSTOMER_ID;

Дайте мне знать, если вы обнаружите какие-либо трудности в данном решении.

Приветствия !!

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