连接多个表,从不同的表中选择计数,并在一个查询中按一列分组

时间:2013-09-18 20:03:11

标签: sql

我需要连接多个表,从不同的表中选择计数,并在一个查询中按一列分组。我就是这样做的:

select      c.CommunityName, SUM(case when m.ListKey = c.ListKey then 1 else 0 end) as Posts
from        Community c with(NOLOCK)
join        messages_ m with(NOLOCK)
on          c.ListKey = m.ListKey
group by    c.CommunityName

select      c.CommunityName, SUM(case when b.CommunityKey = c.CommunityKey then 1 else 0 end) as Blogs
from        Community c with(NOLOCK)
join        Blog b with(NOLOCK)
on          c.CommunityKey = b.CommunityKey
group by    c.CommunityName

select      c.CommunityName, SUM(case when ce.CommunityKey = c.CommunityKey then 1 else 0 end) as Events
from        Community c with(NOLOCK)
join        CalendarEvent ce with(NOLOCK)
on          c.CommunityKey = ce.CommunityKey
where       ce.StartDateTime >= GETDATE()
group by    c.CommunityName

或只是

select      c.CommunityName, COUNT(*)
from        Community c with(NOLOCK)
join        messages_ m with(NOLOCK)
on          c.ListKey = m.ListKey
group by    c.CommunityName

select      c.CommunityName, COUNT(*)
from        Community c with(NOLOCK)
join        Blog b with(NOLOCK)
on          c.CommunityKey = b.CommunityKey
group by    c.CommunityName

select      c.CommunityName, COUNT(*)
from        Community c with(NOLOCK)
join        CalendarEvent ce with(NOLOCK)
on          c.CommunityKey = ce.CommunityKey
where       ce.StartDateTime >= GETDATE()
group by    c.CommunityName

还有更多的桌子,有些需要额外的连接...有人可以帮忙吗?

2 个答案:

答案 0 :(得分:10)

如果我正确理解您的问题,您正在寻找社区名称以及帖子,博客,活动等计数。

当您的查询单独计算时,请在SELECT中为其他计数添加虚拟列,然后在UNION中添加SUM并获取SELECT CommunityName , SUM(MessageCount), SUM(BlogCount), SUM(EventCount) FROM ( SELECT c.CommunityName CommunityName , COUNT(*) MessageCount, 0 BlogCount, 0 EventCount FROM Community c with(NOLOCK) JOIN messages_ m with(NOLOCK) ON c.ListKey = m.ListKey GROUP BY c.CommunityName UNION SELECT c.CommunityName, 0, COUNT(*), 0 FROM Community c with(NOLOCK) JOIN Blog b with(NOLOCK) ON c.CommunityKey = b.CommunityKey GROUP BY c.CommunityName UNION SELECT c.CommunityName, 0, 0, COUNT(*) FROM Community c with(NOLOCK) JOIN CalendarEvent ce with(NOLOCK) ON c.CommunityKey = ce.CommunityKey WHERE ce.StartDateTime >= GETDATE() GROUP BY c.CommunityName ) CountsTable GROUP BY CountsTable.CommunityName

CountsTable

| COMMUNITYNAME | MESSAGECOUNT | BLOGCOUNT | EVENTCOUNT | |---------------|--------------|-----------|------------| | Name | 10 | 0 | 0 | | Name | 0 | 20 | 0 | | Name | 0 | 0 | 30 | 看起来像

GROUP BY

因此,您可以| COMMUNITYNAME | MESSAGECOUNT | BLOGCOUNT | EVENTCOUNT | |---------------|--------------|-----------|------------| | Name | 10 | 20 | 30 | 命名并总结计数以获得结果

{{1}}

答案 1 :(得分:0)

您是否考虑过使用LEFT JOIN来连接表格?然后,您可以检查NULL并总结非NULL值。

SELECT
    c.CommunityName,
    SUM(case when m.ListKey IS NOT NULL then 1 else 0 end) as Posts,
    SUM(case when b.CommunityKey IS NOT NULL then 1 else 0 end) as Blogs,
    SUM(case when ce.CommunityKey IS NOT NULL then 1 else 0 end) as Events
FROM
    Community c WITH(NOLOCK)
        LEFT JOIN
    messages_ m WITH(NOLOCK)
        ON c.ListKey = m.ListKey
        LEFT JOIN
    Blog b WITH(NOLOCK)
        ON c.CommunityKey = b.CommunityKey
        LEFT JOIN
    CalendarEvent ce WITH(NOLOCK)
        ON c.CommunityKey = ce.CommunityKey
WHERE
    ce.StartDateTime >= GETDATE()
GROUP BY
    c.CommunityName