Oracle SQL, чтобы найти население по процентам - PullRequest
0 голосов
/ 30 марта 2020

У меня есть таблица с клиентами, дата покупки и почтовый индекс. Ключ (customer_id, purchase_dt и zip_cd)

Я пытаюсь найти почтовые индексы, где клиенты ведут бизнес, в диапазоне от 80% и выше, 60 - 80%, 40-60%. Может ли кто-нибудь помочь мне с запросом для достижения этой цели.

with tmp as
(
    select 123 as cust_id, date '2017-01-01' purchase_dt, '10035' zip_cd from dual
    union
    select 1234 as cust_id, date '2019-06-01' purchase_dt, '11377' zip_cd from dual
    union
    select 12345 as cust_id, date '2019-07-01' purchase_dt, '11377' zip_cd from dual
    union
    select 234 as cust_id, date '2019-08-01' purchase_dt, '11377' zip_cd from dual
    union
    select 2345 as cust_id, date '2019-09-01' purchase_dt, '11417' zip_cd from dual

)
select * from tmp;

Ожидаемый результат:

80% и выше Почтовый индекс: 11377 и так далее ..

Ответы [ 2 ]

0 голосов
/ 30 марта 2020

Этот ответ будет учитываться, если клиент совершал покупки в течение нескольких дней, и не учитывает их дважды. Кроме того, этот ответ добавляет в группу, обсуждаемую в вопросе:

with tmp as
(
    select 123 as cust_id, date '2017-01-01' purchase_dt, '10035' zip_cd from dual
    union
    select 1234 as cust_id, date '2019-06-01' purchase_dt, '11377' zip_cd from dual
    union
    select 12345 as cust_id, date '2019-07-01' purchase_dt, '11377' zip_cd from dual
    union
    select 234 as cust_id, date '2019-08-01' purchase_dt, '11377' zip_cd from dual
    union
    select 2345 as cust_id, date '2019-09-01' purchase_dt, '11417' zip_cd from dual

)
SELECT sub2.pct_range, listagg(sub2.zip_cd||' ('||sub2.zip_pct||')', ', ') WITHIN GROUP (ORDER BY zip_pct DESC) AS ZIP_CODES
FROM (SELECT CASE
               WHEN sub.zip_pct BETWEEN 80 AND 100 THEN '80% and above'
               WHEN sub.zip_pct BETWEEN 60 AND 79 THEN '60% to 79%'
               WHEN sub.zip_pct BETWEEN 40 AND 59 THEN '40% to 59%'
               WHEN sub.zip_pct BETWEEN 20 AND 39 THEN '20% to 39%'
               ELSE 'Below 20%' 
             END AS PCT_RANGE,
             sub.zip_cd,
             sub.zip_pct
      FROM (SELECT DISTINCT 
              zip_cd, 
              100*COUNT(DISTINCT cust_id) OVER (PARTITION BY zip_cd)/COUNT(DISTINCT cust_id) OVER () AS ZIP_PCT
            FROM tmp) sub) sub2
GROUP BY pct_range
ORDER BY pct_range DESC;
0 голосов
/ 30 марта 2020

Вы можете использовать комбинацию average и analytical function count следующим образом:

with tmp as
(
    select 123 as cust_id, date '2017-01-01' purchase_dt, '10035' zip_cd from dual
    union
    select 1234 as cust_id, date '2019-06-01' purchase_dt, '11377' zip_cd from dual
    union
    select 12345 as cust_id, date '2019-07-01' purchase_dt, '11377' zip_cd from dual
    union
    select 234 as cust_id, date '2019-08-01' purchase_dt, '11377' zip_cd from dual
    union
    select 2345 as cust_id, date '2019-09-01' purchase_dt, '11417' zip_cd from dual

)
select zip_cd, 100*(count(1)/cnt) percntg from
(select zip_cd, count(1) over () cnt from tmp)
group by zip_cd, cnt
order by percntg desc;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...