2012-05-07 83 views
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 

**注:一个人可以张贴同样的 “后”,以多组

我从这个数据我可以建立信任一个柱状图(10-20个用户组,包括21-30个用户,等等),并且在这些不同的箱子中包含组的平均帖子数量。

回答

1

简单的解决办法是使用这些查询作为子查询,并结合他们:

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 
0

保罗的解决方案假定两组组(按员额和用户)是一样的。这可能不是真的,因此无论是全外连接还是全部连接都需要。

我的选择是:

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 

“同向”条款定义中集集团所使用。这将定义放在一个地方,使得两个子查询具有相同的过滤效果。这两个子查询只是简单地标记这两个变量中的每一个,然后在较高级别进行汇总。有时候在子查询中进行聚合也更有效率,特别是在有索引的时候。

+0

OP的查询使用略有不同的过滤:第二个查询中的'gp.Created @startDate和@ enddate'与第一个查询的'LastViewed between @startDate和@ enddate'之间。 “LastViewed”是“Group”列也不是一个确定的事实。 (是的,OP应该更清楚一点,但我们不应该假设太多,如果我们。) –

+0

除此之外,我实际上同意你的方法。我可能会使用连接表中的实际ID和替代项的NULL,因此,我会计算COUNT而不是SUM,但基本上这与您的建议相同。 –

相关问题