Sql-Server

SQL 連接查詢以顯示一個表中不存在的行

  • May 8, 2020

我正在嘗試為員工時間記錄完成一些報告。

我們有兩個專門針對這個問題的表格。員工列在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等。

其他一些注意事項:

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';

… 更整潔,恕我直言,只要您使用合理的別名。

引用自:https://dba.stackexchange.com/questions/53151