лояльность против не лояльных клиентов количество клиентов и продажи SQL - PullRequest
0 голосов
/ 06 марта 2020

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

TXN_DATE    INDIVIDUAL_ID   TRANSACTION_NUMBER  ITEM_NUM    SLS    ACT_TRANSACTION_ID
1/2/2019          1               12345           326       $10     123366777
1/2/2019          1               12345           112       $20     123366777
1/2/2019          1               12345           554       $30     123366777 
2/3/2019          1               35565           144       $40     655544444 
2/3/2019          1               35565           585       $20     655544444 
4/3/2019          4               88567           987       $20     656697778 
4/3/2019          4               88567           788       $15     656697778 
5/3/2019          4               22456           659       $10     366655544 
5/3/2019          4               22456           781       $60     366655544 
1/23/2019         5               89464           364       $40     647778777
1/23/2019         5               89464           564       $30     647778777
4/3/2019          6               32224           891       $20     987779899   
4/3/2019          6               32224           345       $30     987779899

Другая таблица транзакций выглядит следующим образом:

TXN_DATE    INDIVIDUAL_ID   TRANSACTION_NUMBER  SLS Loyalty_Number    ACT_TRANSACTION_ID
1/2/2019         1                12345         $60     987654     123366777
2/3/2019         1                35565         $60     null       655544444
4/3/2019         4                88567         $35     234456     656697778
5/3/2019         4                22456         $70     null       366655544
1/23/2019        5                89464         $70     655498     647778777
4/3/2019         6                32224         $50     556645     987779899

Существует 3-я таблица лояльности, поэтому, если клиент является участником лояльности, он будет в таблице ниже.

INDIVIDUAL_ID   Loyalty_number  
1                 987654            
4                 234456            
5                 655498           
6                 556645

Я пытаюсь найти количество клиентов и их продаж для лояльность против статуса не лояльности. Ниже приведен запрос, который я использую:

SELECT GROUPS,
    COUNT(DISTINCT Customer_ID) COUNT_OF_CUSTOMERS,
    SUM(DOLLAR_VALUE_US) DOLLAR_VALUE_US,
    SUM(COUNT_OF_TRANSACTIONS) COUNT_OF_TRANSACTIONS

    FROM (
SELECT DISTINCT
             Customer_ID,
             CASE WHEN COUNT(DISTINCT LOYALTY) = 1 THEN 'ONLY' || ' ' || MAX(LOYALTY)
             ELSE 'CROSS'
             END AS GROUPS,
             SUM (DOLLAR_VALUE_US)             DOLLAR_VALUE_US,
             COUNT (DISTINCT TRANSACTION_NUMBER) COUNT_OF_TRANSACTIONS ---ADDED DISTINCT
        FROM (SELECT A.Customer_ID,
              CASE WHEN CARD_NUMBER IS NULL THEN 'NONLOYALTYTXN'
              WHEN CARD_NUMBER IS NOT NULL THEN 'LOYALTYTXN' END AS LOYALTY,
                     DOLLAR_VALUE_US,
                     TXN_DATE,
                     A.TRANSACTION_NUMBER

                FROM transaction_detail A JOIN transaction B ON A.ACT_TRANSACTION_ID = B.ACT_TRANSACTION_ID)
       WHERE TRUNC (TXN_DATE) BETWEEN '01-JAN-19' AND '31-DEC-19'
       AND Customer_ID IS NOT NULL
    GROUP BY Customer_ID)

    GROUP BY GROUPS;

Используя этот запрос, я получаю три сегмента: 1) только верность 2) только нелояльность 3) кросс

Есть ли способ просто найти верность а не номера лояльности? потому что есть также случаи, когда клиент мог не указать свой номер лояльности во время оформления заказа (например, клиенты 1 и 4). Я не уверен, как поступить с этим.

Ответы [ 2 ]

1 голос
/ 06 марта 2020

Если я предполагаю, что лояльность связана с наличием карты, которая предполагает:

SELECT (CASE WHEN t.Card_Number IS NOT NULL THEN 'Loyal' ELSE 'Disloyal'
        END) as grp,
       COUNT(DISTINCT t.individual_id) as num_customers,
       SUM(sls) as sales
FROM transaction t
GROUP BY (CASE WHEN t.Card_Number IS NOT NULL THEN 'Loyal' ELSE 'Disloyal'
          END)
0 голосов
/ 06 марта 2020

Для этого вам просто нужен второй стол:

select 
count(distinct(INDIVIDUAL_ID)),
sum(case when Card_Number is null then SLS else 0 end) as non_loyalty_sum,
sum(case when Card_Number is not null then SLS else 0 end) as loyalty_sum
from transactions; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...