2015-05-11 5 views
2

У меня есть эта таблицакомплекс отборное на одной колонке

create table customers(id int, cust text, email id, cust_grp int); 

и я использую следующий запрос на выборку, чтобы получить 3 результаты в 3 различных условиях

select count(*) as cust_with_email 
from customers where email<>'' and cust_grp=101; 

result 
-------- 
199 

select count(*) as cust_without_email 
from customers where email='' and cust_grp=101; 
result 
-------- 
3370 

select count(*) as cust_total 
from customers where cust_grp=101; 
result 
-------- 
3569 

Но теперь мне нужно, чтобы объединить эти три запросов в один выбор и ожидаемый результат:

custemaildet 
--------------------- 
3569|199|3370 

ответ

1

Вы можете использовать case when для фильтрации emailколонка и сцепить результат, используя | символ

SELECT count(*) || '|' || count(CASE 
      WHEN email <> '' 
       THEN email 
      END) || '|' || count(CASE 
      WHEN email = '' 
       THEN email 
      END) custemaildet 
FROM customers 
WHERE cust_grp= 101 
0

Использование условной агрегации:

select count(*) as cust_total, 
     sum(case when email = '' then 1 else 0 end) as cust_without_email , 
     sum(case when email <> '' then 1 else 0 end) as cust_with_email  
from customers 
where cust_grp = 101 

Если вы хотите один столбец, то вы можете Concat их вместе:

select concat(count(*), '|', 
       sum(case when email = '' then 1 else 0 end), '|', 
       sum(case when email <> '' then 1 else 0 end) 
      )  
from customers 
where cust_grp = 101 
0

Try это:

SELECT count(*), count(email = '' OR NULL), count(email <> '' OR NULL) 
FROM customers 
WHERE cust_grp = 101; 

Или в PG 9.4+:

SELECT 
    count(*), 
    count(*) FILTER (WHERE email = ''), 
    count(*) FILTER (WHERE email <> '') 
FROM customers 
WHERE cust_grp = 101; 
Смежные вопросы