1

** 显然有些人认为我的问题不值得他们花时间。我全心全意地为此道歉。然而,与其否决投票,为什么不利用这段时间做一些积极的事情,至少告诉我你需要什么信息才能让这不是你眼中的 cr@p 问题。**

我在 table 中有一个员工列表,在 table 中有tblMembers一个客户列表tblClients

一个人可能有几个客户。

与客户相关联的工作人员通过staffId客户记录来识别。

每个员工都有一个针对他们拥有的客户类型的类别 ID catId

我需要找到给定客户类型的所有员工,然后按他们拥有的客户数量对他们进行排序。没有任何客户的员工应该显示结果为 0 而不是不显示。

一个简化的表结构是:

tblMembers

Id | catId

tblClients

Id | staffId 

任何帮助将不胜感激。

谢谢!

4

4 回答 4

2

试试这个:

SELECT m.Id 'Member Id', ISNULL(c.StaffCount, 0) 'StuffCount'
FROM tblMembers m
LEFT JOIN
(
    SELECT staffId, COUNT(staffId) 'StaffCount'
    FROM tblClients
    GROUP BY staffId
) c ON m.Id = c.staffId
WHERE m.Cat = 'Some Id'
ORDER BY StuffCount
于 2012-10-16T15:27:16.327 回答
2

加入/组和计数相当简单

SELECT
   s.id,
   s.catid,
   COUNT(c.id)
FROM 
   tblMembers s
   LEFT JOIN tblClients  c
   ON s.id = c.staffid
WHERE
   s.catid = @catID
GROUP BY 
  s.id,
  s.catid
ORDER BY 
    COUNT(c.id) desc   

然而,一个棘手的问题是

显示结果为 0 而不是不显示。

为此,您需要进行左连接以确保即使没有匹配的记录也能显示它们,并且您需要确保计算连接右侧表中的字段。否则你会得到 1

演示

于 2012-10-16T15:28:00.820 回答
1

希望我正确理解了你的情况。
尝试这样的事情:

SELECT T1.ID, 
       Count(*) 
FROM   MEMBERS T1 
       INNER JOIN CLIENTS T2 
               ON T1.ID = T2.STAFFID 
WHERE  T1.CATID = 2 
GROUP  BY T1.ID 
UNION 
SELECT DISTINCT ID, 
                0 
FROM   MEMBERS 
WHERE  CATID != 2 

此处提供了一个工作示例。

于 2012-10-16T15:30:34.183 回答
1

尝试:

select tblMembers.id, count(tblClient.id)
from tblMembers left join tblCLient on staffId = tblMembers.id
where tblMembers.catId = ??
group by tblMembers.id
order by 2 desc
于 2012-10-16T15:31:12.127 回答