SQL查询以获取字段为另一个特定字段重复的次数

时间:2018-05-29 09:04:34

标签: mysql sql count

我们说我在桌子上有两个字段。为了讨论的目的,让我们说这些字段是名字和姓氏。我想知道名字出现在同一姓氏旁边的名字多少次。假设姓氏列是唯一的,我如何计算每个姓氏每个名字的存在次数?

即。让我们说我有一张包含以下数据的表格:

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)

值得注意的是,第二个字段可能会重复,因此计算列中的唯一实例是没有用的。它仅对第一个字段有用。

感谢。

4 个答案:

答案 0 :(得分:1)

您可以在SELECT语句中使用相关的子查询,然后将其全部包装在concat函数中以获取所需的内联结果

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

答案 1 :(得分:0)

我的解决方案:

select name,surname, count(surname) over (partition by name) as cnt
from your_table

答案 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) 

答案 3 :(得分:0)

简单聚合?

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

中显示它,John,3,David,1,Jane,1 格式可能会失败,因为史密斯太多了不同的姓氏。