[英]Join assistance
我有一个记录出勤统计的表(出勤表)。 在每一行中,有以下内容:
只有当成员被标记为出席时,一行才会出现“1”表示出席。 有一些例外,有人错误地单击了它们,然后将它们切换回,在这种情况下,行将包含“0”。
然后我有另一个表(日期表),其中列出了所有可能的事件日期。
我正在寻找一种方法来显示特定与会者的每个可能日期的列表,以显示是否存在。 我尝试了一些 JOIN 组合,但无法获取在出勤表中没有关联行的日期的值。
我知道我可以在我的应用程序代码中使用 FOREACH LOOP 来做到这一点,但我更愿意让 DB Engine 来完成这项工作,因为它更有效率。
我希望输出类似于:
提前感谢你的帮助。
更新:
以下是特定成员在 8 月份的出勤表中的数据示例。
以下是日期表中的数据示例,其中显示了 8 月份的所有可能日期。
如果该成员在特定日期不在场,我希望能够显示这一点....如果他们不在场,则出勤表的已参加列中将有一个 NULL 记录或 (0)。
我认为您可以使用带有一些聚合的left join
。 假设您有成员和日期表,那么:
select e.*, m.memberid, coalesce(a.attended, 0) as attended
from members m cross join
events e left join
(select eventid, memberid, max(attended) as attended
from attendance a
group by eventid, memberid
) a
on m.memberid = a.memberid and e.eventid = a.eventid;
如果您没有用于成员和事件的单独表,则可以使用子查询,例如(select distinct memberid from attendance)
。
我想我想通了......
SELECT tad.date, DAYNAME(tad.date) as Day,
(SELECT COUNT(*)
FROM attendance a
WHERE a.MemberID = pMemberID
AND a.ServiceTypeID = 1
AND a.Date = tad.date) AS Attended_SS,
(SELECT COUNT(*)
FROM attendance a
WHERE a.MemberID = pMemberID
AND a.ServiceTypeID = 2
AND a.Date = tad.date) AS Attended_AM,
(SELECT COUNT(*)
FROM attendance a
WHERE a.MemberID = pMemberID
AND a.ServiceTypeID = 3
AND a.Date = tad.date) AS Attended_PM,
(SELECT COUNT(*)
FROM attendance a
WHERE a.MemberID = pMemberID
AND a.ServiceTypeID = 4
AND a.Date = tad.date) AS Attended_WED
FROM t_AllDates tad
WHERE tad.date BETWEEN pStartDate AND pEndDate;
生成以下输出(不完美,但对我有用)
谢谢您的帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.