簡體   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