2016-01-28 2 views
0

Извините за заголовок, но моя проблема трудно объяснить.MySQL Выберите количество строк с определенным атрибутом

У меня есть таблица под названием "TEL_LIST" с этих полей:

  • ID
  • ТЕЛЕФОН
  • СТАТУС

У меня есть много строк для одного номера телефона. Статус может быть ДА или НЕТ.

Я хочу подсчитать общее количество строк со статусом «НЕТ» (без учета строк «ДА») только для телефонных номеров, имеющих хотя бы один статус «ДА».

Для того, чтобы вы лучше понять, я хочу это:

EDIT:

TEL:011, STATUS:YES 
TEL:011, STATUS:NO 
TEL:011, STATUS:NO 
TEL:012, STATUS:NO 
TEL:012, STATUS:NO 
TEL:012, STATUS:NO 
RESULT: 2. 

TEL:011, STATUS:YES 
TEL:011, STATUS:NO 
TEL:011, STATUS:NO 
TEL:012, STATUS:YES 
TEL:012, STATUS:NO 
TEL:012, STATUS:NO 
RESULT: 4. 

Возможно, я не объяснил хорошо: Я хочу, чтобы общее количество (сумма) всех «Нет «записи, которые имеют хотя бы одну запись« Да ».

Для того чтобы вы хорошо понимали, я работаю в контакт-центре. Я хочу, чтобы общее количество всех отрицательных вызовов (статус: нет) стало положительным (статус: да).

Еще раз спасибо!

ответ

0

Использование Conditional Aggregate для подсчета значений

select TEL, 
     count(case when STATUS = 'Yes' Then 1 end) AS Conditional_Count 
from yourtable 
Group by TEL 

Другой способ

SUM(case when STATUS = 'Yes' Then 1 ELSE 0 end) 

Update: На основании разъяснений в вопросе

select count(case when STATUS = 'NO' Then 1 end) AS Conditional_Count 
from yourtable 
Having count(case when STATUS = 'YES' Then 1 end) > 0 
+0

Извините, возможно, я не очень хорошо объяснил. Я хочу считать строки «Нет» телефона, который имеет хотя бы один статус «Да». Я не хочу считать строки Да. Спасибо! –

+0

@ L.Soprano - Обновлена ​​проверка сейчас –

0

Я думаю, что это следует за логика:

select tel, 
     (case when sum(status = 'Yes') = 0 then 0 
      else sum(status = 'No') 
     end) 
from t 
group by tel; 
0

Я думаю, что, может быть, это может помочь мне:

select count(case when STATUS != 'YES' Then 1 end) AS TOT 
from T 
having (select count(case when STATUS='YES' Then 1 end) AS T)>0 AND TOT>0 

Я попытался это решение, но я не уверен, что результат является правильным ...

0

Я хотел бы использовать левое соединение и группа по запросу:

select t1.tel, count(t2.tel) AS total_no 
from 
    TEL t1 left join TEL t2 
    on t1.tel=t2.tel AND t1.status='Yes' AND t2.status='No' 
group by 
    t1.tel 

с индексом по телефону и статусу, характеристики должны быть оптимальными. Номера, которые не имеют статуса = «Да», не будут возвращены.

0

Попробуйте один:

выберите x.Tel, граф (отличный x.Number) из ( выберите t.Tel, случай, когда TMP.тел не равно нулю, то Id еще нулевой конец как номер от yourtable т левое внешнее соединение ( выберите тел из yourtable где статус = «Да» ) TMP на tmp.Tel = t.Tel где t.status = «Нет» ) x group by x.tel

Смежные вопросы