2015-09-04 4 views
0

Я пытаюсь выбрать сумму значений в столбце isOK для каждого разделенного Name, но только если isOK = 1 на Day = 2.Совокупность строк, если одна строка соответствует определенному условию

Запрос на следующем примере таблицы tablename

Name | Day | isOK 
char | int | int 
----------------- 
Flo | 1 | 1 
Seb | 1 | 1 
Tim | 1 | 0 
Flo | 2 | 1 
Seb | 2 | 0 
Tim | 2 | 1 

должен дать Фло: 2 и Тим: 1, но не Seb: 1, так как его isOK на Day = 2 0.

I «Я пытался использовать SUM (isOK) с конструкциями IF, но он просто не работает. Мое альтернативное решение, чтобы выбрать все Name, где isOK = 1 и выбрать SUM (isOK) для каждого из имен, является медленным и, похоже, нуждается в улучшении.

Я думаю, это не так сложно, но я пробовал уже несколько часов, и я просто не могу объединить два моих запроса в один.

ответ

1

Один из способов сделать это, чтобы использовать условное выражение вместе с having пункта, как это:

select name, sum(isOk) ok_sum 
from your_table 
group by name 
having sum(case when day = 2 and isOK = 1 then 1 else 0 end) > 0; 

С вашими данными выборки результат будет:

name ok_sum 
Flo  2 
Tim  1 

Как MySQL оценивает логическое выражений как 1 или 0, следует уменьшить условие:

having sum(day = 2 and isOK = 1) > 0; 

Другой способ сделать это было бы использовать коррелированный подзапрос, убеждается существует ряд с Day = 2 и isOk = 1 для Name:

select t1.name, sum(t1.isOk) ok_sum 
from your_table t1 
where exists (
    select 1 
    from your_table t2 
    where t2.day = 2 and t2.isOK = 1 and t1.name = t2.name 
) 
group by t1.name 
+0

Я добавил скрипку, которая (наконец) дала мне ответ. Может быть, это даст и другим людям, в конце концов :) –

+0

@ X.L.Ant Спасибо. Я не мог заставить скрипку работать - думаю, это может закончиться из-за высокой нагрузки или чего-то еще. – jpw

+0

Думаю, да. SQLfiddle в последнее время многое сделал. –

0

TRY это:

SELECT 
    name, SUM(isok) AS isOk 
FROM 
    table 
GROUP BY `name` 
HAVING SUM(`day` = 2 AND isok = 1) > 0; 
0
SELECT x.name, SUM(y.isOK) total 
    FROM my_table x 
    JOIN my_table y 
    ON y.name = x.name 
WHERE x.day = 2 
    AND x.isok=1 
GROUP 
    BY x.name; 
Смежные вопросы