Подтвердить что ты не робот

Считать без группы

У меня есть одна таблица с именем GUYS (ID, NAME, PHONE), и мне нужно добавить кол-во, сколько парней имеют одинаковое имя, и в то же время показать все из них, поэтому я не могу их сгруппировать. Пример:

ID NAME  PHONE
1  John  335   
2  Harry 444
3  James 367
4  John  742
5  John  654

желаемый вывод должен быть

ID NAME  PHONE COUNT
1  John  335   3
2  Harry 444   1
3  James 367   1
4  John  742   3
5  John  654   3

как я могу это сделать? Мне удается получить много парней с разным счетом.

спасибо

4b9b3361

Ответ 1

Так как MySQL не имеет аналитических функций, таких как Oracle, вам придется прибегнуть к подзапросу.

Не используйте GROUP BY, используйте подвыбор, чтобы подсчитать количество парней с тем же именем:

SELECT
  t.name,
  t.phone,
  (SELECT COUNT('x') FROM Guys ct 
   WHERE ct.name = t.name) as namecounter
FROM
  Guys t

Можно подумать, что выполнение подвыборки для каждой строки будет медленным, но если у вас есть соответствующие индексы, MySQL будет оптимизировать этот запрос, и вы увидите, что он работает отлично.

В этом примере у вас должен быть индекс на Guys.name. Если у вас есть несколько столбцов в предложении where подзапроса, запрос, вероятно, выиграет от единого комбинированного индекса во всех этих столбцах.

Ответ 2

Используйте агрегированный запрос:

select g.ID, g.Name, g.Phone, count(*) over ( partition by g.name ) as Count
from 
Guys g;

Ответ 3

Вы все равно можете использовать GROUP BY для подсчета, вам просто нужно вернуть JOIN обратно в исходную таблицу, чтобы получить все записи, например:

select g.ID, g.Name, g.Phone, gc.Count
from Guys g
inner join (
    select Name, count(*) as Count
    from Guys
    group by Name
) gc on g.Name = gc.Name

Ответ 4

В Oracle DB вы можете использовать

SELECT ID,NAME,PHONE,(Select COUNT(ID)From GUYS GROUP BY Name) FROM GUYS ;