SQL计数麻烦

时间:2013-09-03 17:36:03

标签: mysql sql

我有一个表格,我从中选择“项目经理”并提取有关它们的数据。

他们每个人都有许多他们管理的“客户”。

客户端按名称链接到他们的项目经理。

例如:John Smith有3个客户。每个客户都有一个名为“经理”的名字。

以下是该表的简单版本:

name       | type    | manager
--------------------------------------
John Smith | manager |
Client 1   | client  | John Smith
Client 2   | client  | John Smith
Client 3   | client  | John Smith
John Carry | manager |
Client 4   | client  | John Carry
Client 5   | client  | John Carry
Client 6   | client  | John Carry

如何返回以下数据?

约翰史密斯 - 3个客户

John Carry - 3位客户

4 个答案:

答案 0 :(得分:7)

您应该能够使用自联接和count()聚合函数来获得结果:

select t.name,
  count(t1.name) TotalClients
from yourtable t
inner join yourtable t1
  on t.name = t1.manager
group by t.name;

请参阅SQL Fiddle with Demo

如果您希望结果包含Clients文字,那么您需要CONCAT()函数:

select t.name,
  concat(count(t1.name), ' Clients') TotalClients
from yourtable t
inner join yourtable t1
  on t.name = t1.manager
group by t.name;

请参阅SQL Fiddle with Demo

如果您想根据type添加WHERE子句,那么您将使用:

select t.name,
  concat(count(t1.name), ' Clients') TotalClients
from yourtable t
inner join yourtable t1
  on t.name = t1.manager
where t.type = 'manager'
group by t.name

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

您不需要在此处加入。一个简单的group by可以完成这项工作:

Select manager, count(*) as totalClients from yourtable group by 1, order by 2 desc

这将列出所有经理和他们拥有的客户数量。拥有最多客户的经理是第一位的。这样就省略了连接,查询速度会更快。

fromgroup by之间,您可以添加where谓词来过滤客户或经理或其他列。

答案 2 :(得分:0)

如果经理可用,

选择count(1),经理 来自Table_Project 按经理分组

如果我没有遗漏任何信息,那么上面的查询应该会产生所需的结果。

答案 3 :(得分:0)

试试这个

select manager, concat(count(*), ' Clients') TotalClients
from yourtable 
where manager is not null
group by manager