Сгруппировать и подсчитать

Есть таблица TableName:

id   a        b       brand
1   001      zyb      apl
2   002      yan      apl
3   002      pit      ggl
4   101      zyb      ggl
5   003      zyb      ggl
6   102      yan      apl
7   002      pit      msf 

Результат:

 a        b       brand   c
001      zyb      apl     2
002      yan      apl     2
002      pit      ggl     2
003      zyb      ggl     2
002      pit      msf     1 
SELECT
    a,
    b,
    brand,
    COUNT(brand) AS c
FROM
    TableName
WHERE
    a REGEXP '^00'
ORDER BY
    c ASC

Получаю такую ошибку:

This is incompatible with sql_mode=only_full_group_by


Ответы (2 шт):

Автор решения: Эдван Янг
SELECT seller, location, brand, COUNT(brand) as c 
FROM TablName 
WHERE seller REGEXP '^00' 
GROUP BY seller, location, brand 
ORDER BY c ASC;

Я добавил GROUP BY seller, location, brand. Это позволяет агрегировать данные по указанным полям, что соответствует требованиям режима ONLY_FULL_GROUP_BY.COUNT(brand). Теперь COUNT(brand) будет работать корректно, так как все остальные поля в SELECT теперь находятся в GROUP BY.

Теперь запрос должен выполняться без ошибок.

→ Ссылка
Автор решения: Akina

Для СУБД, поддерживающей оконные функции, используйте

WITH TableName (id, a, b, brand) AS (
  SELECT 1,   '001',      'zyb',      'apl' UNION ALL
  SELECT 2,   '002',      'yan',      'apl' UNION ALL
  SELECT 3,   '002',      'pit',      'ggl' UNION ALL
  SELECT 4,   '101',      'zyb',      'ggl' UNION ALL
  SELECT 5,   '003',      'zyb',      'ggl' UNION ALL
  SELECT 6,   '102',      'yan',      'apl' UNION ALL
  SELECT 7,   '002',      'pit',      'msf'
  )
SELECT
    a,
    b,
    brand,
    COUNT(brand) OVER (PARTITION BY brand) AS c
FROM
    TableName
WHERE
    a REGEXP '^00'
ORDER BY
    c ASC
a b brand c
002 pit msf 1
001 zyb apl 2
002 yan apl 2
002 pit ggl 2
003 zyb ggl 2

fiddle

Для MySQL версии 5.5 можно использовать

SELECT TableName.a, TableName.b, brand, counts.c
FROM TableName
NATURAL JOIN (
  SELECT brand, COUNT(brand) AS c
  FROM TableName
  WHERE a REGEXP '^00'
  GROUP BY brand
  ) AS counts
WHERE a REGEXP '^00';

или

SELECT a, b, brand, 
  ( SELECT COUNT(brand)
    FROM TableName t2
    WHERE a REGEXP '^00'
      AND brand = t1.brand
    ) AS c
FROM TableName t1
WHERE a REGEXP '^00';

fiddle

→ Ссылка