结合SQL连接和计数

结合SQL连接和计数,sql,sql-server,Sql,Sql Server,我有两个表registered和attended,每个表都有两列:AttendentId和SessionId。我想分别从这两个表中查询特定会话id的AttendantId计数 例如: 登记 出席 我想获得以下输出: Count(Registered) Count(Attended) Session ID 2 1 SN1 1 0 SN2 1

我有两个表
registered
attended
,每个表都有两列:
AttendentId
SessionId
。我想分别从这两个表中查询特定会话id的
AttendantId
计数

例如:

登记 出席 我想获得以下输出:

Count(Registered)   Count(Attended)  Session ID    
2                   1                SN1    
1                   0                SN2 
1                   1                SN3


您可以使用
完全外部连接

select 
  coalesce(a.sessionid, r.sessionid) sessionid,
  count(r.AttendantId) countRegistered,
  count(a.AttendantId) countAttended
from registered r
full outer join attended a
  on r.sessionid = a.sessionid
  and r.AttendantId = a.AttendantId
group by coalesce(a.sessionid, r.sessionid);

请参见您可以使用
完全外部联接

select 
  coalesce(a.sessionid, r.sessionid) sessionid,
  count(r.AttendantId) countRegistered,
  count(a.AttendantId) countAttended
from registered r
full outer join attended a
  on r.sessionid = a.sessionid
  and r.AttendantId = a.AttendantId
group by coalesce(a.sessionid, r.sessionid);
请参见尝试:

select count(distinct registered), 
       count(distinct attended), 
       SessionId
from (select AttendantId registered, null attended, SessionId
      from registered
      union all
      select null registered, AttendantId attended, SessionId
      from Attended) sq
group by SessionId
尝试:

请尝试此查询

select 
   a.sessionId, 
   case when aCnt is null then 0 else acnt end, 
   case when bCnt is null then 0 else bcnt end
from
   (select 
       sessionId, 
       count(*) aCNt 
   from 
       tbl1 
   group by 
       sessionid) a
full join
   (select 
       sessionId, 
       count(*) bCnt 
   from 
       tbl2 
   group by 
       sessionid) b
on 
   a.sessionId = b.sessionid
: 希望这有助于……

尝试此查询

select 
   a.sessionId, 
   case when aCnt is null then 0 else acnt end, 
   case when bCnt is null then 0 else bcnt end
from
   (select 
       sessionId, 
       count(*) aCNt 
   from 
       tbl1 
   group by 
       sessionid) a
full join
   (select 
       sessionId, 
       count(*) bCnt 
   from 
       tbl2 
   group by 
       sessionid) b
on 
   a.sessionId = b.sessionid

希望这有助于……

假设已注册表中存在所有会话ID

SELECT Sum(CASE 
             WHEN a.attendentid IS NOT NULL THEN 1 
             ELSE 0 
           end) AS Count(registered), 
       Sum(CASE 
             WHEN b.attendentid IS NOT NULL THEN 1 
             ELSE 0 
           end) AS Count(attended), 
       a.sessionid 
FROM   registered a 
       INNER JOIN attended b 
               ON a.sessionid = b.sessionid 
GROUP  BY a.sessionid 

假设已注册表中存在所有会话ID

SELECT Sum(CASE 
             WHEN a.attendentid IS NOT NULL THEN 1 
             ELSE 0 
           end) AS Count(registered), 
       Sum(CASE 
             WHEN b.attendentid IS NOT NULL THEN 1 
             ELSE 0 
           end) AS Count(attended), 
       a.sessionid 
FROM   registered a 
       INNER JOIN attended b 
               ON a.sessionid = b.sessionid 
GROUP  BY a.sessionid 

到目前为止你试过什么?请添加到您的问题中,以便我们看到您的错误所在。示例输出中前两列的标题混淆了。我尝试使用基于会话ID的联接,但它返回的是助理ID的叉积。registered中的会话ID与attended中的会话ID之间的关系是什么?参加的会话ID是否始终是已注册会话ID的子集?到目前为止,您尝试了什么?请添加到您的问题中,以便我们看到您的错误所在。示例输出中前两列的标题混淆了。我尝试使用基于会话ID的联接,但它返回的是助理ID的叉积。registered中的会话ID与attended中的会话ID之间的关系是什么?出席的会话ID是否始终是已注册会话ID的子集?@user1989463:很高兴我能提供帮助。@user1989463:很高兴我能提供帮助。
SELECT Sum(CASE 
             WHEN a.attendentid IS NOT NULL THEN 1 
             ELSE 0 
           end) AS Count(registered), 
       Sum(CASE 
             WHEN b.attendentid IS NOT NULL THEN 1 
             ELSE 0 
           end) AS Count(attended), 
       a.sessionid 
FROM   registered a 
       INNER JOIN attended b 
               ON a.sessionid = b.sessionid 
GROUP  BY a.sessionid