按sql排序表计数

时间:2013-03-05 19:30:50

标签: sql sql-server sql-server-2008

我在sql server中有一个包含以下字段的表

firstname,id,affID

affID是其他用户的ID。

让我说我有这个记录

firstname     id    affID
bob            1     2        
someone        2     3
bob2           3     2 
baaroz         4     3
lastman        5     2

我想创建一个查询,通过此计数向我显示此ID在其他用户订单中的firstname,id和affID计数。

所以最后输出应该是这样的

firstname  id     count(number of this id in affID of other users)
someone    2            3
bob2       3            2
bob        1            0
baaroz     4            0
lastman    5            0

到目前为止,我创建此查询,返回每个id的affID数量

SELECT affID, count(affID) FROM Users group by affID

上面提到的输出的正确查询是什么?

3 个答案:

答案 0 :(得分:1)

您应该能够使用子查询来获取计数,然后加入您的表:

select u1.firstname,
  u1.id,
  coalesce(u2.total, 0) total
from users u1
left join
(
  SELECT affID, count(affID) Total
  FROM Users 
  group by affID 
) u2
  on u1.id = u2.affID
order by u2.total desc;

请参阅SQL Fiddle with Demo

答案 1 :(得分:0)

您需要进行自我加入以获取每个用户的计数,并离开外部联接以将其映射回所有用户..

此查询提供影响其他用户的每个用户的受影响用户数:

SELECT U.id                           -- This is the ID of the user that affected others
     , Count(U2.id) as Cnt            -- This is the Count 
  FROM Users U
  INNER JOIN User U2 
          ON U.AffUserId = U2.id
 GROUP BY U.id

然后,您需要进行最后的LEFT OUTER JOIN,然后将此汇总数据映射到表格中的所有用户(即使是那些没有影响任何人的用户)

SELECT Usr.firstName
     , Usr.id
     , ISNULL(Ctbls.Cnt, 0) as [Count]
  FROM Users Usr
LEFT OUTER JOIN
   (SELECT U.id, Count(U2.id) as Cnt
      FROM Users U
      INNER JOIN User U2 
              ON U.AffUserId = U2.id
      GROUP BY U.id) CTbls
    ON Usr.id = Ctbls.Id

答案 2 :(得分:0)

我认为你的baaroz和lastman的ID值不应该是“1”,而应该分别是“4”和“5”。如果这是真的,那么我相信我理解你的问题,你需要做的就是添加

"ORDER BY Count(AffUserId) DESC" 

到查询结尾。

(由于Id和用户名看起来是唯一的,您只需将用户名添加到您的组中。这是多余的,但比使用子查询并将表连接回自身更容易。)