Несколько СЧЕТОВ в MYSQL с условием для отдельного столбца - PullRequest
0 голосов
/ 11 января 2020

У меня есть таблица, упомянутая ниже, и я пытаюсь получить общее количество на основе условия с полем cont и группировать по записи

someTable

    ID    guid      entry    cont
    ---   -----     -----    -----
    1     g1        e1       NULL
    2     g2        e2       NULL
    3     g1        e1       NULL
    4     g3        e1       72345
    5     g1        e3       NULL
    6     g2        e2       34567

Желаемый результат:

    entry    total_c   total_con
    ---      -----      ----------
    e1       3          1
    e2       2          1
    e3       1          0

Я использую следующий запрос, но он возвращает total_con всей таблицы для каждой строки

SELECT entry, count(*) AS total_c, (SELECT count(*) FROM someTable WHERE cont IS NOT NULL) AS total_con FROM someTable GROUP BY entry

, которая дает

    entry    total_c   total_con
    ---      -----      ----------
    e1       3          2
    e2       2          2
    e3       1          2

Как мне достичь результата? Любая помощь будет оценена

Заранее спасибо

Ответы [ 3 ]

1 голос
/ 11 января 2020

Используйте условный оператор для третьего столбца:

select entry, count(*) as total_c, 
       sum(case when cont is not null then 1 else 0 end) as total_con
  from someTable
 group by entry

или замените столбец total_con на sum(sign(ifnull(cont ,1))) в качестве альтернативы.

Демо

1 голос
/ 11 января 2020

Требуется условное агрегирование:

SELECT 
  entry, 
  count(*) AS total_c, 
  sum(cont is not null) AS total_con 
FROM someTable 
GROUP BY entry

Выражение cont is not null оценивается как 0 или 1, поэтому SUM() суммы по этим значениям. Смотрите демо . Результаты:

| entry | total_c | total_con |
| ----- | ------- | --------- |
| e1    | 3       | 1         |
| e2    | 2       | 1         |
| e3    | 1       | 0         |
0 голосов
/ 11 января 2020

Вы бы просто использовали COUNT(). Он делает именно то, что вам нужно:

SELECT entry, COUNT(*) AS total_c, 
       COUNT(cont) AS total_con 
FROM someTable 
GROUP BY entry;

COUNT() считает количество ненулевых значений.

...