Запрос SQL для получения количества повторений поля для другого определенного поля

0

Скажем, у меня есть два поля в таблице. Для обсуждения давайте скажем, что поля - это имя и фамилия. Я хочу знать, сколько раз появляется первое имя, указанное рядом с тем же именем. Предполагая, что столбец с фамилией уникален, как определить, сколько раз каждое имя существует для каждой фамилии?

т.е. скажем, у меня есть таблица со следующими данными:

Smith, John
Smith, David
Smith, Jane
Smith, John
Smith, John
Black, John
Black, Jane
Black, Jack
Black, Samantha
Black, Jack

Мне нужен результат, который говорит мне, что для Смита есть 3 Иоанна, 1 Давида и 1 Джейн, а для Блэка - 2 Валета, 1 Джейн и 1 Саманта.

Не знаете, как лучше отформатировать вывод. Может быть, просто:

Smith, John, 3, David, 1, Jane, 1
Black, Jack, 2, Jane, 1, Samantha, 1

Что-то, что позволит мне легко выводить что-то вроде:

Smith: John (3), David (1), Jane (1)
Black: Jack (2), Jane (1), Samantha (1)

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

Благодарю.

  • 0
    Колонны , а не поля ...
Теги:
count

4 ответа

0
Лучший ответ

Простая агрегация?

select last_name, first_name, count(*)
from myTable
group by last_name, first_name
order by  last_name, first_name

Отображение его в формате Смита, Джона, 3, Дэвида, 1, Джейн, 1, вероятно, потерпит неудачу, потому что слишком много Смитов слишком много разных имен.

  • 0
    Это кажется довольно хорошим, но как мне сделать так, чтобы он сортировал по фамилии, а затем по количеству (а не по имени). У меня это работало, когда я возился с SQL, но я потерял его и теперь не могу заставить его работать снова.
  • 0
    На самом деле, я могу получить его для вставки count ( ) в столбец count: выберите last_name, first_name, count ( ) cnt, а затем: order by last_name, cnt, хотя мне нужно, чтобы порядок cnt был обратным (от высшего к низшему)
Показать ещё 1 комментарий
1

Вы можете использовать коррелированный подзапрос в своей SELECT а затем обернуть все это в функцию concat, чтобы получить встроенный результат, который вам нужен

SELECT  DISTINCT
        CONCAT(LastName, ': ', FirstName, '(', (SELECT COUNT(FirstName) FROM Person WHERE FirstName = p.FirstName AND LastName = p.LastName),')')
FROM    Person p
0

Мое решение:

select name,surname, count(surname) over (partition by name) as cnt
from your_table
  • 0
    Должен быть MYSQL версии 8 или выше
  • 0
    Я думаю, что это не помечено
Показать ещё 2 комментария
0

Вы можете использовать это.

SELECT CONCAT( Name,':', GROUP_CONCAT(CONCAT( LastName, ' (', CNT , ')' ), ' ') ) 
FROM (
  SELECT Name, LastName, COUNT(*) CNT FROM MyTable
  GROUP BY 
  Name, LastName
 ) T 
 GROUP BY Name

Sql Fiddle

Результат:

Black:Jane (1) ,John (1) ,Samantha (1) ,Jack (2)
Smith:David (1) ,Jane (1) ,John (3) 
  • 0
    Мне нравится форматирование и ссылка на SQL Fiddle (хороший сайт), хотя я не совсем все понимаю. Как бы вы получили, чтобы отсортировать имена по количеству (то есть показать в порядке наибольшего количества).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню