0

ユーザーが独自のグループを作成できるツールがあります。これらのグループ内で、ユーザーは投稿を書くことができます。私が判断しようとしているのは、グループのサイズとそのグループ内の投稿の総数との関係です。

SQLステートメントを実行して、グループ名とそのグループ内のユーザー数のリスト(クエリ1)、およびグループ名と投稿数のリスト(クエリ2)を取得できますが、両方を同じにしたいです。クエリ。

クエリ1

select count(pg.personID) as GroupSize, g.GroupName
from Group g inner join PersonGroup pg g.GroupID = pg.GroupID
where LastViewed between @startDate and @enddate and
    g.Type = 0
group by g.GroupID, g.GroupName
order by GroupSize

クエリ2

select count(gp.PostID) as TotalPosts, g.GroupName
from Group g inner join GroupPost gp on g.GroupID = gp.GroupID
    inner join Post p on gp.PostID = p.PostID
where g.Type = 0 and
    gp.Created between @startDate and @enddate
group by g.GroupID, g.GroupName
order by TotalPosts

**注:1人のユーザーが同じ「投稿」を複数のグループに投稿できます

このデータから、ヒストグラム(10〜20ユーザー、21〜30ユーザーなどのグループの数)を作成し、それらの異なるビンにグループの平均投稿数を組み込むことができると思います。

4

2 に答える 2

2

簡単な解決策は、これらのクエリをサブクエリとして使用し、それらを組み合わせることです。

SELECT 
    grps.GroupName,
    grps.GroupSize,
    psts.TotalPosts
FROM (
    select count(pg.personID) as GroupSize, g.GroupName, g.GroupID
    from Group g inner join PersonGroup pg g.GroupID = pg.GroupID
    where LastViewed between @startDate and @enddate and
        g.Type = 0
    group by g.GroupID, g.GroupName
    order by GroupSize) grps
JOIN (
    select count(gp.PostID) as TotalPosts, g.GroupName, g.groupID
    from Group g inner join GroupPost gp on g.GroupID = gp.GroupID
        inner join Post p on gp.PostID = p.PostID
    where g.Type = 0 and
        gp.Created between @startDate and @enddate
    group by g.GroupID, g.GroupName
    order by TotalPosts) psts
ON psts.GroupID = grps.GroupID
于 2012-05-07T15:06:07.853 に答える
0

Paulのソリューションは、2セットのグループ(投稿別およびユーザー別)が同じであることを前提としています。これは当てはまらない可能性があるため、完全外部結合またはすべての結合が必要です。

私の好みは次のとおりです。

with groups as 
(
   select *
   from Group g
   where g.Type = 0 
     and g.LastViewed between @startDate and @enddate
)
select GroupId, GroupName, SUM(GroupSize) as GroupSize, SUM(TotalPosts) as TotalPosts)
from 
(
  (select groups.GroupId, groups.GroupName, 1 as GroupSize, 0 as TotalPosts
   from groups 
   join PersonGroup pg 
     on pg.GroupId = groups.groupId
   ) 
   union all
   (select groups.GroupId, groups.GroupName, 0 as GroupSize, 1 as TotalPosts
    from groups 
    join GroupPost gp
      on groups.GroupId = gp.GroupId 
    join Post p
      on gp.PostId = p.PostId
    )
)
group by GroupId, GroupName

「with」句は、使用しているグループのセットを定義します。これにより、定義が1つの場所に配置され、2つのサブクエリが同じフィルタリングを使用していることが明らかになります。2つのサブクエリには、2つの変数のそれぞれを示すフラグがあり、それらは上位レベルで集計されます。特にインデックスがある場合は、サブクエリ内で集計を行う方が効率的な場合があります。

于 2012-05-07T19:42:49.877 に答える