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

Sql 连接多个表,从不同的表中选择计数,并在一个查询中按一列分组,sql,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 b

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

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

还有更多的表,有些表需要额外的联接。。。有人能帮忙吗?

如果我没弄错您的问题,您正在查找社区名称以及诸如帖子、博客、事件等计数

当您的查询单独计数时,在
中为其他计数添加虚拟列,然后在
UNION
中添加虚拟列,并获取
总和

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 |
因此,您可以通过
名称对计数进行分组,并对计数进行汇总以获得结果

| COMMUNITYNAME | MESSAGECOUNT | BLOGCOUNT | EVENTCOUNT |
|---------------|--------------|-----------|------------|
|          Name |           10 |        20 |         30 |

您是否考虑过使用
LEFT JOIN
连接表?然后,您可以检查空值并对非空值求和

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

您不能将它们全部合并在一起,添加一个静态文本字段来区分每个组吗?我还是一个婴儿SQL向导;)我去看看工会。谢谢你的结果应该是什么?来自不同查询的所有计数之和?很抱歉延迟。最后,我向我们的一位SQL天才寻求帮助,但显然我想自己去寻找答案。这正是他的建议!非常感谢。非常感谢你!我被困在尝试不同的技术3个小时,直到我尝试了这个!