У меня есть таблица ниже, и я хочу сделать следующее:
Подсчитайте, сколько раз каждый элемент появляется в таблице
Посчитать DISTINCT
Количество предметов
Сгруппировать предметы по имени
+-------+---------+
| id | names |
+-------+---------+
| 1 | Apple |
| 2 | Orange |
| 3 | Grape |
| 4 | Apple |
| 5 | Apple |
| 6 | Orange |
| 7 | Apple |
| 8 | Grape |
+-------+---------+
Для пунктов 1. и 3. у меня есть следующий запрос, который работает довольно хорошо:
SELECT * ,
COUNT(names) as count_name,
FROM tbl_products WHERE type = '1'
GROUP BY names
Итак, я получаю:
Apple (4)
Orange (2)
Grape (2)
Теперь я хочу также подсчитать количество сгруппированных по строкам и добавить строку для подсчета отдельных элементов, однако есть некоторая проблема, поскольку MySQL принимает запрос, но не может вывести результат:
SELECT * ,
COUNT(names) as count_name,
COUNT(DISTINCT names) as count_total
FROM tbl_products WHERE type = '1'
GROUP BY names
Может кто-нибудь посоветовать, в чем может быть проблема?
РЕДАКТИРОВАТЬ: Для большего разрешения я хочу получить таблицу, как это:
+-------+---------+------------+-------------+
| id | names | count_ctg | count_total |
+-------+---------+------------+-------------+
| 1 | Apple | 4 | 3 |
| 2 | Orange | 2 | 3 |
| 3 | Grape | 2 | 3 |
+-------+---------+------------+-------------+
Почему бы просто не использовать запрос, который вы используете:
SELECT * ,
COUNT(names) as count_name,
FROM tbl_products WHERE type = '1'
GROUP BY names
Этот запрос достигает всех трех целей.
1) Вы получаете количество каждого значения имени в count_name
,
2) Количество отличных names
значения будут равны количеству строк в наборе результатов, так как вы группируете по names
, Практически любая клиентская библиотека подключений MySQL DB позволит вам получить это значение.
3) Вы соответствуете третьим критериям группировки по имени, явно используя GROUP BY names
Конечно значение для id
в наборе результатов не имеет смысла, вы можете выбрать только names
а также count_names
,
Вы можете получить количество отдельных имен в подзапросе, а затем НАРУЖНО присоединиться к этой вещи обратно в ваш основной запрос, который вы уже решили для 1 и 3:
SELECT names ,
COUNT(names) as count_name,
Total
FROM tbl_products
OUTER JOIN (SELECT count(DISTINCT names) as Total FROM tbl_products) t2
WHERE type = '1'
GROUP BY names
1-. Подсчитайте, сколько раз каждый элемент появляется в таблице:
SELECT names, count(names) FROM tbl_products WHERE type = '1' group by names
2-. Сколько различных элементов существует в таблице:
SELECT DISTINCT names FROM tbl_products WHERE type = '1'
3-. Сгруппировать элементы по имени:
SELECT count(DISTINCT names) as Total FROM tbl_products WHERE type = '1'
Как ваше последнее редактирование (все в одном):
SELECT id, names, count(names), total FROM tbl_products, (select count(distinct names) as total from tbl_products) as total WHERE type = '1' group by names
Вы можете использовать SQL Windowing OVER ()
Этот запрос возвращает функцию row_number () в качестве столбца id в результатах, а over (…) для row_number требует предложения order by. Вы можете заказать все, что захотите, но это будет что-то заказано.
;WITH vwGroups (name, Quantity) AS
(
SELECT name
, COUNT(*)
FROM tbl_products
GROUP BY name
)
SELECT ROW_NUMBER() OVER(ORDER BY Quantity DESC, name) AS id
, name
, Quantity AS count_name
, COUNT(*) OVER () AS count_total
FROM vwGroups