Подсчитайте количество повторяющихся пар информации - PullRequest
1 голос
/ 05 мая 2020

У меня есть таблица с customer_ID, date и payment_method в виде 3 столбцов. payment_method может быть «ca sh», «кредит» или «другие». Я хочу узнать количество клиентов, которые использовали кредит в качестве способа оплаты более 5 раз за последние 6 месяцев.

Я нашел это решение для отображения строк, в которых клиент использовал кредит:

SELECT customer_ID, payment_method, COUNT(*) AS unique_pair_repeats
FROM tab1
WHERE customer_ID IS NOT NULL
GROUP BY customer_ID, payment_method
HAVING count(*) > 1;

Проблема в том, что мне не нужен список имен / идентификаторов, я хочу знать сколько людей использовали свою кредитную карту для покупок 5 и более раз за последние 6 месяцев.

Ответы [ 2 ]

2 голосов
/ 05 мая 2020

Это один из способов сделать это:

SELECT COUNT(*) 
FROM 
(
  SELECT customer_id 
  FROM tab1
  WHERE 
    customer_ID IS NOT NULL and 
    payment_method = 'credit' and 
    tran_date > add_months(sysdate, -6)
  GROUP BY customer_ID
  HAVING count(*) > 5
) x

Внутренний запрос генерирует список всех идентификаторов клиентов, которые использовали кредит более 5 раз за 6 месяцев. Внешний запрос считает их

Возможно, вам кажется более логичным написать это так:

SELECT COUNT(*) 
FROM 
(
  SELECT customer_id, count(*) as ctr 
  FROM tab1
  WHERE 
    customer_ID IS NOT NULL and 
    payment_method = 'credit' and 
    tran_date > add_months(sysdate, -6)
  GROUP BY customer_ID
) x
WHERE x.ctr > 5
1 голос
/ 05 мая 2020

Итак, удалите customer_ID, payment_method, из select.

Хотя это все еще не отвечает «по крайней мере 5 раз за последние 6 месяцев», поэтому вам нужно другое условие: date (предполагая вы используете Oracle, хотя вы не пометили вопрос, но - вы используете Oracle SQL Developer):

and date_column >= add_months(trunc(sysdate), -6)

Наконец, что-то вроде этого может помочь:

SELECT COUNT(*) AS unique_pair_repeats                 --> changes here
FROM tab1
WHERE customer_ID IS NOT NULL
  and date_column >= add_months(trunc(sysdate), -6)    --> here
GROUP BY customer_ID, payment_method
HAVING count(*) >= 5;                                  --> here
...