结合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