SQL - попытка найти клиентов по группам расходов, а затем сгруппировать их по возрасту и полу - PullRequest
0 голосов
/ 13 марта 2020

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

SELECT 
  gender, 
  agegroup, 
  Count(DISTINCT individual_id), 
  Count(DISTINCT transaction_number), 
  SUM(spend)
FROM 
  (
    SELECT 
      gender, 
      CASE WHEN age < 18 THEN '<18' WHEN age BETWEEN 18 
      AND 24 THEN '18-24' WHEN age BETWEEN 25 
      AND 32 THEN '25-32' WHEN age BETWEEN 33 
      AND 39 THEN '35-39' WHEN age BETWEEN 40 
      AND 46 THEN '40-46' WHEN age BETWEEN 47 
      AND 53 THEN '46-52' WHEN age BETWEEN 54 
      AND 60 THEN '53-58' WHEN age > 60 THEN '61+' END AS AGEGROUP, 
      individual_id,
      transaction_number, 
      spend
    FROM 
      (SELECT 
          gender, 
          age AS age, 
          a.individual_id as individual_id, 
          dollar_value_us as Spend, 
          transaction_number as transaction_number

          FROM transaction_detail_mv a
    join gender_details b on a.individual_id = b.individual_id)
  ) 
GROUP BY 
  gender, 
  agegroup 
ORDER BY 
  gender, 
  agegroup

Текущие результаты:

GENDER | AGEGROUP | COUNT(DISTINCTINDIVIDUAL_ID) | COUNT(DISTINCTTRANSACTION_NUMBER) | SUM(SPEND)
:----- | :------- | ---------------------------: | --------------------------------: | ---------:
F      | 46-52    |                            1 |                                 2 |         22
M      | 18-24    |                            1 |                                 1 |         11
M      | 40-46    |                            2 |                                 6 |         62

Поэтому вместо фильтрации по всему запросу, чтобы найти число клиентов, которые находятся в диапазоне от $ 10 до $ 23, как показано ниже: мне просто нужен запрос, который разделил бы данные на когорты расходов.

select * from (SELECT 
  gender, 
  agegroup, 
  Count(DISTINCT individual_id), 
  Count(DISTINCT transaction_number), 
  SUM(spend) as spend
FROM 
  (
    SELECT 
      gender, 
      CASE WHEN age < 18 THEN '<18' WHEN age BETWEEN 18 
      AND 24 THEN '18-24' WHEN age BETWEEN 25 
      AND 32 THEN '25-32' WHEN age BETWEEN 33 
      AND 39 THEN '35-39' WHEN age BETWEEN 40 
      AND 46 THEN '40-46' WHEN age BETWEEN 47 
      AND 53 THEN '46-52' WHEN age BETWEEN 54 
      AND 60 THEN '53-58' WHEN age > 60 THEN '61+' END AS AGEGROUP, 
      individual_id,
      transaction_number, 
      spend
    FROM 
      (SELECT 
          gender, 
          age AS age, 
          a.individual_id as individual_id, 
          dollar_value_us as Spend, 
          transaction_number as transaction_number

          FROM transaction_detail_mv a
    join gender_details b on a.individual_id = b.individual_id)
  ) 
GROUP BY 
  gender, 
  agegroup 
ORDER BY 
  gender, 
  agegroup) where spend between 10 and 20

Я ищу следующие когорты расходов:

<$10
$10-$20
$20-$30
$30-$40
$40+

Это ссылка на скрипку:

https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=fe7bbe67da923fde05b5daf8ad991e7c

Так, например, x количество клиентов находится в пределах $ 10-40 $ диапазон, который является женщиной и принадлежит к 18-24 возрастным диапазонам. Это то, к чему я в конечном итоге пытаюсь добраться. Есть ли способ включить это в мой текущий запрос?

любая помощь будет оценена. Спасибо !!

1 Ответ

2 голосов
/ 13 марта 2020

Возможно что-то вроде этого:

    SELECT 
      gender, 
      agegroup, 
      Count(DISTINCT individual_id) customer_count, 
            CASE WHEN SUM(spend) < 10 THEN '<$10' WHEN SUM(spend) >= 10 
          AND SUM(spend) < 20 THEN '$10-$20' WHEN SUM(spend) >= 20 
          AND SUM(spend) < 30 THEN '$20-$30' WHEN SUM(spend) >= 30 
          AND SUM(spend) < 40 THEN '$30-$40' WHEN SUM(spend) >= 40 THEN '$40+' END AS spendgroup
    FROM 
      (
        SELECT 
          gender, 
          CASE WHEN age < 18 THEN '<18' WHEN age BETWEEN 18 
          AND 24 THEN '18-24' WHEN age BETWEEN 25 
          AND 32 THEN '25-32' WHEN age BETWEEN 33 
          AND 39 THEN '35-39' WHEN age BETWEEN 40 
          AND 46 THEN '40-46' WHEN age BETWEEN 47 
          AND 53 THEN '46-52' WHEN age BETWEEN 54 
          AND 60 THEN '53-58' WHEN age > 60 THEN '61+' END AS AGEGROUP, 
          individual_id,
          spend
        FROM 
          (SELECT 
              gender, 
              age, 
              a.individual_id, 
              dollar_value_us as Spend
             FROM transaction_detail_mv a
        join gender_details b on a.individual_id = b.individual_id)
      ) 
    GROUP BY 
      gender, 
      agegroup
    ORDER BY 
      gender, 
      agegroup;


Вывод:

    |GENDER |AGEGROUP   |CUSTOMER_COUNT |SPENDGROUP |
    |F      |46-52      |1              |$20-$30    |   
    |M      |18-24      |1              |$10-$20    |
    |M      |40-46      |2              |$40+       |


DB Fiddle здесь


...