0

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

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

客户通过名称链接到他们的项目经理。

例如: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

4 回答 4

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

如果你想添加一个基于 的 WHERE 子句type,那么你将使用:

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

于 2013-09-03T17:39:09.830 回答
0

你不需要在这里加入。一个简单group by的可以做的工作:

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

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

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

于 2013-09-03T17:52:48.963 回答
0

如果经理有空,

select count(1),Manager from Table_Project group by Manager

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

于 2013-09-03T17:56:18.550 回答
0

尝试这个

select manager, concat(count(*), ' Clients') TotalClients
from yourtable 
where manager is not null
group by manager 
于 2013-09-03T17:58:54.073 回答