Сгруппировать и подсчитать
Есть таблица 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 |
Для 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';