Группировка по мужскому и женскому SQL - - PullRequest
0 голосов
/ 04 марта 2019

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

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

Я хотел бы объединить две таблицы, чтобы получить следующий результат:

табличное изображение, пожалуйста, посмотрите

Это был мой оригинальный пост, в котором я хотел просто получить новых и старых клиентов:

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

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

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

    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
, count(distinct individual_id) indiv
, count (distinct transaction_number) txn_count
, sum(dollar_value_us) as Spend
, sum(quantity),
CASE WHEN MIN(txn_date) = min_txn_date THEN 1 ELSE 0 END is_new
from (SELECT 
        DISTINCT a.individual_id, 
        a.dollar_value_us,
        a.txn_date,
        a.quantity,
        a.transaction_number,
        b.gender,
        b.age,
        MIN(txn_date) OVER(PARTITION BY a.individual_id) min_txn_date          
    FROM transaction_detail_mv   a
    join gender_details b on a.individual_id = b.individual_id
    WHERE 
        a.brand_org_code = 'BRAND'
        AND a.is_merch = 1
        AND a.currency_code = 'USD'
        AND a.line_item_amt_type_cd = 'S')

where txn_date >= TO_DATE('10-02-2019', 'DD-MM-YYYY') 
    AND txn_date < TO_DATE('17-02-2019', 'DD-MM-YYYY')

group by 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,
individual_id,
min_txn_date

Проблема с этим кодом заключается в том, что он не группирует возрастные диапазоны.поэтому, если есть 2 мужчины в возрасте до 1 года, которые возвращаются клиентами, это дает мне две записи, и мне нужно только 1.

Ответы [ 2 ]

0 голосов
/ 11 марта 2019

Подход к использованию таблицы PL / SQL был предложен для форматирования вывода в соответствии с определением таблицы (https://i.stack.imgur.com/0cjvm.png). Использование PL / SQL помогло бы преобразовать строки в столбцы, если бы это было фактической формулировкой проблемы.

Проблема в запросе, касающемся группировки по возрастным группам и возвращающемуся клиенту, связана с тем, что «индивидуальный_идентификатор» был добавлен в группу по предложению. Индивидуальный_идентификатор определяет возраст, а не возрастную группу, добавление индивидуального_идентификатора в предложение «группа по» создаетнабор результатов сгруппирован по возрасту. Запрос был исправлен, как показано ниже, я провел несколько тестов для описанного сценария, и он работает. Пожалуйста, проверьте и подтвердите, работает ли это или нет.

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
, count(distinct individual_id) indiv 
, count (distinct transaction_number) txn_count
, sum(dollar_value_us) as Spend
, sum(quantity),
CASE WHEN MIN(txn_date) = min_txn_date THEN 1 ELSE 0 END is_new
from (SELECT 
        DISTINCT a.individual_id, 
        a.dollar_value_us,
        a.txn_date,
        a.quantity,
        a.transaction_number,
        b.gender,
        b.age,
        MIN(txn_date) OVER(PARTITION BY a.individual_id) min_txn_date          
    FROM transaction_detail_mv   a
    join gender_details b on a.individual_id = b.individual_id
    WHERE 
        a.brand_org_code = 'BRAND'
        AND a.is_merch = 1
        AND a.currency_code = 'USD'
        AND a.line_item_amt_type_cd = 'S')
where txn_date >= TO_DATE('10-02-2019', 'DD-MM-YYYY') 
    AND txn_date < TO_DATE('17-02-2019', 'DD-MM-YYYY')
group by 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,
/*individual_id,*/
min_txn_date 
0 голосов
/ 04 марта 2019

Использование процедуры PL / SQL или анонимного блока PL / SQL представляется простым и жизнеспособным вариантом.В будущем может возникнуть узкое место в производительности для текущего запроса, который использует слишком много агрегатных функций.

  • Объявите таблицу PL / SQL, проиндексированную целым числом в соответствии с форматом, определенным в таблице.
  • PL / SQL таблица должна иметь 7 (как определено в выходной таблице) + 1 (тип клиента - возврат / новый) столбцов
  • Условно заполнить таблицу, зациклив набор результатов из запросов.Male специфический элемент данных идет в соответствующий столбец в таблице pl / sql, в то время как женский специфический элемент идет в соответствующие столбцы для каждого из возрастных критериев.
  • Как только все наборы результатов загружены в таблицу PL / SQL,цикл через печать его с соответствующим форматированием.Надеюсь, это поможет.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...