Как мне подсчитать строки запроса GROUP BY, если условие соответствует? - PullRequest
3 голосов
/ 03 мая 2020

Это моя личная таблица:

neighborhood  birthyear
a             1958
a             1959
b             1970
c             1980

Я хотел бы получить COUNT людей в возрастной группе в каждом районе. Например, если бы я хотел получить всех в возрасте до 18 лет, я бы получил:

neighborhood  count
a             0
b             0
c             0

Если бы я хотел получить всех старше 50 лет, я бы получил

neighborhood  count
a             2
b             0
c             0

Я попытался

SELECT neighborhood, COUNT(*)
    FROM persons
    WHERE YEAR(NOW()) - persons.birthyear < 18
    GROUP BY neighborhood;

, но это дает мне 0 строк, когда вместо этого я хочу 3 строки с различными окрестностями и 0 счетчиков для каждой. Как бы я совершил sh это?

Ответы [ 3 ]

3 голосов
/ 03 мая 2020

Вы можете использовать условное агрегирование:

SELECT neighborhood, SUM(YEAR(NOW()) - p.birthyear) as under_18,
       SUM(YEAR(NOW()) - p.birthyear BETWEEN 34 AND 42) as age_34_42
FROM persons p
GROUP BY neighborhood;
1 голос
/ 03 мая 2020

Я думаю, что если счетчик равен 0, строка не появляется. Мне кажется, ваш код верен, если вы попробуете его на примере с 50-летним возрастом, он должен дать вам одну строку с ожидаемой строкой (соседство: a, количество: 2)

0 голосов
/ 03 мая 2020

Я бы порекомендовал использовать подзапрос:

SELECT 
    count(*) [group-by-count-greater-than-ten] 
FROM 
(
   SELECT 
      columnFoo, 
      count(*) cnt
   FROM barTable
   WHERE columnBaz = "barbaz"
   GROUP BY columnFoo
) 
AS subQuery
WHERE cnt > 10

В приведенном выше наборе результатов возврата subquery используется main query в качестве любой другой таблицы.

Столбец cnt больше не воспринимается main query как вычисляемое поле и не должен ссылаться на функцию count().

Однако внутри subquery, в котором выполняется предложение where или предложение having, которое должно смотреть на столбец псевдонима cnt, на функцию count() следует ссылаться как на ссылку cnt в subquery выдаст ошибку.

В вашем случае использование subquery будет выглядеть примерно так:

SELECT 
    neighborhood, 
    age, 
    count(*) as cnt
FROM
(
     SELECT 
         *, 
         (YEAR(NOW()) - birthyear) as age 
     FROM PERSONS
) as WithAge
WHERE age < 18
GROUP BY neighborhood, age
...