繁体   English   中英

加盟协助

[英]Join assistance

我有一个记录出勤统计的表(出勤表)。 在每一行中,有以下内容:

  • 活动日期(日期)
  • 会员 ID (int)
  • 事件 ID (int)
  • 出席(位)

只有当成员被标​​记为出席时,一行才会出现“1”表示出席。 有一些例外,有人错误地单击了它们,然后将它们切换回,在这种情况下,行将包含“0”。

然后我有另一个表(日期表),其中列出了所有可能的事件日期。

我正在寻找一种方法来显示特定与会者的每个可能日期的列表,以显示是否存在。 我尝试了一些 JOIN 组合,但无法获取在出勤表中没有关联行的日期的值。

我知道我可以在我的应用程序代码中使用 FOREACH LOOP 来做到这一点,但我更愿意让 DB Engine 来完成这项工作,因为它更有效率。

我希望输出类似于:

  • EventDate(来自日期表)
  • MemberID(来自考勤表)
  • EventID(来自考勤表)
  • 已出席(来自出勤表)- 这将是 0 或 1

提前感谢你的帮助。

更新:

以下是特定成员在 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM