[英]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.