Как сделать SQL-запрос COUNT DISTINCT с условиями? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть таблица ВЗАИМОДЕЙСТВИЯ, которая содержит

  • datetime,
  • идентификатор клиента,
  • сегмент клиента (группа 'A' или группа 'B'),
  • ответ клиента.

Образец таблицы:

datetime       | CustomerID | Segment | Response
---------------+------------+---------+---------
20181126000001 | 1          | A       | Accept  
20181126000005 | 1          | A       | Ignore  
20181126000010 | 2          | B       | Ignore  
20181126000015 | 3          | A       | Accept  

Моя задача - сделать запрос, который получает различное количество клиентов с условиями:

  1. количество клиентов, принадлежащих к сегменту «А»;
  2. если нет клиентов из сегмента «А», то подсчитать всех клиентов.

Так что в псевдокоде я хочу сделать что-то вроде этого:

CASE
    WHEN 
        (select count distinct CustomerID from INTERACTIONS where Segment = 'A') = 0 
    THEN 
        (select count distinct CustomerID from INTERACTIONS)
    ELSE
        (select count distinct CustomerID from INTERACTIONS where Segment = 'A')
END

Ожидаемый результат - одно значение.В этом примере результат = 2.

Можете ли вы помочь записать полный запрос в БД?

Ответы [ 3 ]

0 голосов
/ 28 ноября 2018

Вы можете сделать это с помощью подзапроса (избегайте двойных вычислений)

SELECT CASE WHEN T.customer_a > 0 THEN customer_a ELSE customer_all FROM
(
   SELECT 
       (SELECT count(distinct customer_id) FROM INTERACTIONS WHERE segment = 'A') AS customer_a,        
       (SELECT count(distinct customer_id) FROM INTERACTIONS) AS customer_all   )
) AS T
0 голосов
/ 28 ноября 2018

Иметь производную таблицу (подзапрос), где вы используете выражение case для выполнения условного агрегирования для подсчета клиентов сегмента A и подсчета всех клиентов.

select case when acnt > 0 then acnt else allcnt end
from
(
    select count(distinct case when segment = 'A' then CustomerID end) acnt,
           count(distinct CustomerID) allcnt
    from INTERACTIONS
) dt
0 голосов
/ 28 ноября 2018

Вы можете попробовать ниже

select 
CASE
    WHEN count(distinct case when Segment = 'A' then CustomerID end)=0 THEN count(distinct CustomerID)
    ELSE
        count(distinct case when Segment = 'A' then CustomerID end)
from INTERACTIONS
...