-2

次のフィールドを含むSQLServerのテーブルがあります

firstname,id,affID

affIDは他のユーザーのIDです。

私はこの記録を持っているとしましょう

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

他のユーザーのこのIDの名、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

上記の出力に対する正しいクエリは何ですか?

4

3 に答える 3

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 FiddlewithDemoを参照してください

于 2013-03-05T19:37:25.973 に答える
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
于 2013-03-05T19:34:46.460 に答える
0

baarozとlastmanのID値は「1」ではなく、それぞれ「4」と「5」である必要があると思います。それが本当なら、私はあなたの質問を理解していると信じています、そしてあなたがする必要があるのは追加することだけです

"ORDER BY Count(AffUserId) DESC" 

クエリの最後まで。

(IDとユーザー名は一意であるように見えるため、でユーザー名をグループに追加するだけです。冗長ですが、サブクエリを使用してテーブルをそれ自体に結合するよりも簡単です。)

于 2013-03-05T19:37:37.217 に答える