Скажем, у меня есть два поля в таблице. Для обсуждения давайте скажем, что поля - это имя и фамилия. Я хочу знать, сколько раз появляется первое имя, указанное рядом с тем же именем. Предполагая, что столбец с фамилией уникален, как определить, сколько раз каждое имя существует для каждой фамилии?
т.е. скажем, у меня есть таблица со следующими данными:
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)
Важно отметить, что возможно повторение второго поля, поэтому подсчет уникальных экземпляров в столбце не является полезным. Это полезно только в отношении первого поля.
Благодарю.
Простая агрегация?
select last_name, first_name, count(*)
from myTable
group by last_name, first_name
order by last_name, first_name
Отображение его в формате Смита, Джона, 3, Дэвида, 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
Мое решение:
select name,surname, count(surname) over (partition by name) as cnt
from your_table
Вы можете использовать это.
SELECT CONCAT( Name,':', GROUP_CONCAT(CONCAT( LastName, ' (', CNT , ')' ), ' ') )
FROM (
SELECT Name, LastName, COUNT(*) CNT FROM MyTable
GROUP BY
Name, LastName
) T
GROUP BY Name
Результат:
Black:Jane (1) ,John (1) ,Samantha (1) ,Jack (2)
Smith:David (1) ,Jane (1) ,John (3)