SQL считает записи равными 1 значению и считает и группирует остальные

#mysql #sql #database #count #group-by

#mysql #sql #База данных #подсчитывает #группировать по

Вопрос:

У меня возникли проблемы с запросом, который мне нужно написать. По какой-то причине я не могу заставить что-либо работать. Я знаю, что решение очень простое, но я просто не могу об этом подумать.

Допустим, у меня есть таблица в моей БД под названием «entrys», которая выглядит следующим образом:

 ID  |  Item  |  value
------------------------------
1  |  item 1  |  3
2  |  item 1  |  4
3  |  item 1  |  3
4  |  item 2  |  3
5  |  item 3  |  3
6  |  item 1  |  3
7  |  item 1  |  3
8  |  item 1  |  3
9  |  item 4  |  3
10 |  item 4  |  6
 

Я хочу подсчитать, сколько раз встречается элемент 1, где значение = 3, а затем сгруппировать другие элементы вместе, чтобы обеспечить для них количество, равное = 3, поэтому, например, вывод для этой таблицы будет

   Item  |  Count
---------------------
Item 1  |  5
Other   |  3
 

Поскольку элемент 1 встречается в 5 раз со значением 3, а все остальные элементы, имеющие значение 3, группируются вместе и отображаются как другие со значением 3

Ответ №1:

Ключом к агрегации является case оператор. Затем вам также нужно посчитать соответствующие значения. В MySQL вы можете сделать:

 SELECT (CASE WHEN Item = 'item 1' THEN Item ELSE 'Other' END) AS Item, COUNT(*) AS `Count3`
FROM entrys e
WHERE value = 3
GROUP BY Item;
 

MySQL позволяет использовать псевдонимы столбцов в GROUP BY . Если вы хотите подсчитать все и где значение равно 3, тогда вы можете сделать:

 SELECT (CASE WHEN Item = 'item 1' THEN Item ELSE 'Other' END) AS Item,
       COUNT(*) as AllCount, SUM(value = 3) as Count3
FROM entrys e
GROUP BY Item;
 

Ответ №2:

Попробуйте использовать производную таблицу, где ваши элементы называются либо Item1 или Other . Затем сгруппируйте производную таблицу по имени и выберите количество.

 SELECT
    Item,
    COUNT(*)
FROM (
  SELECT
    (CASE
        WHEN Item = 'item 1'
        THEN 'Item 1'
        ELSE 'Other'
    END) Item
  FROM items
  WHERE value = 3) t1
GROUP BY Item
 

Комментарии:

1. Это сработало как шарм. Просто нужно было добавить предложение where и дал нужные мне результаты, спасибо за вашу помощь, я был так близок, но это просто вылетело у меня из головы.

Ответ №3:

 SELECT CASE Item WHEN 'item 1' THEN Item ELSE 'Other' END AS Item, COUNT(ID) AS `Count`
FROM entrys
GROUP BY CASE Item WHEN 'item 1' THEN Item ELSE 'Other' END