我在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
上面提到的输出的正确查询是什么?
答案 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;
答案 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和用户名看起来是唯一的,您只需将用户名添加到您的组中。这是多余的,但比使用子查询并将表连接回自身更容易。)