SQL 連接查詢以顯示一個表中不存在的行
我正在嘗試為員工時間記錄完成一些報告。
我們有兩個專門針對這個問題的表格。員工列在
Members
表格中,他們每天輸入他們已執行工作的時間條目並儲存在Time_Entry
表格中。使用 SQL Fiddle 設置範例:http ://sqlfiddle.com/#!3/e3806/7
我要的最終結果是一個表格,它在列列表中顯示所有的
Members
,然後將顯示它們在其他列中查詢的日期的總小時數。問題似乎是,如果
Time_Entry
表中沒有特定成員的行,則該成員現在有行。我嘗試了幾種不同的連接類型(左、右、內、外、全外等),但似乎沒有一個能滿足我的需求,這將是(基於 SQL Fiddle 中的最後一個範例):/*** Desired End Result ***/ Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL ADavis | 0 | 11-10-2013 | 0 | 0 BTronton | 0 | 11-10-2013 | 0 | 0 CJones | 0 | 11-10-2013 | 0 | 0 DSmith | 0 | 11-10-2013 | 0 | 0 EGirsch | 1 | 11-10-2013 | 0.92 | 1 FRowden | 0 | 11-10-2013 | 0 | 0
當我查詢 11-1 的特定日期時,我目前得到的是:
Member_ID | COUNTTime_Entry | TIMEENTRYDATE | SUMHOURS_ACTUAL | SUMHOURS_BILL EGirsch | 1 | 11-10-2013 | 0.92 | 1
根據 EGirsch 2013 年 11 月 10 日的一個時間條目行,這是正確的,但我需要查看其他成員的零才能獲取報告,並最終獲取此資訊的 Web 儀表板/報告。
這是我的第一個問題,當我搜尋加入查詢等時。老實說,我不確定這個函式可能被稱為什麼,所以我希望這不是重複的,並且會幫助其他人也試圖找到解決方案類似的問題。
感謝您提供 SQLfiddle 和範例數據!我希望更多的問題以這種方式開始。
如果您想要所有成員,無論他們是否有該日期的條目,您都需要一個
LEFT OUTER JOIN
. 您對這個版本非常接近,但是外連接的一個小技巧是,如果您在WHERE
子句中向外部表添加過濾器,則將外連接轉換為內連接,因為它將排除NULL
該側的任何行(因為它不知道是否NULL
匹配過濾器)。我修改了第一個查詢以獲取每個成員的一行:
SELECT Members.Member_ID ,Time_Entry.Date_Start ,Time_Entry.Hours_Actual ,Time_Entry.Hours_Bill FROM dbo.Members LEFT OUTER JOIN dbo.Time_Entry --^^^^ changed from FULL to LEFT ON Members.Member_ID = Time_Entry.Member_ID AND Time_Entry.Date_Start = '20131110'; --^^^ changed from WHERE to AND
我將把它作為練習留給讀者從那裡獲取並添加其他列、格式
COALESCE
等。其他一些注意事項:
- 在創建和引用對象時請始終使用模式前綴
- 轉換為 varchar 等時請始終使用長度。
- 遠離模棱兩可的區域日期格式,例如
mm-dd-yyyy
- 考慮使用別名使您的查詢更易於閱讀。例如,上面可以重寫為:
SELECT m.Member_ID ,t.Date_Start ,t.Hours_Actual ,t.Hours_Bill FROM dbo.Members AS m LEFT OUTER JOIN dbo.Time_Entry AS t ON m.Member_ID = t.Member_ID AND t.Date_Start = '20131110';
… 更整潔,恕我直言,只要您使用合理的別名。