我有一個疑問,我很難把頭繞過。我需要更新基於以下條件的臨時表中的字段:用於更新臨時表的複雜查詢。可能派生的表格或相關的子查詢?
- 我正在休假原因的員工,如果他們目前在休假
- 的員工被認爲是休假,如果EmpSts是
On Leave
- 請假理由是從EmlChgRsn(就業變動原因)列,因此如果員工是在離開所期望的輸出將是在這種情況下
- 記錄,其中
EmlEfdDt IS NULL
是最新的入門要麼FMLAFull Beg
或FMLAInt Beg
該員工。 - 下面顯示了兩種不同類型的數據場景。第一個圖像是簡單的 - 如果
EmlEfdDt IS NULL and EmlSts = "On Leave" and EmlChgRsn LIKE '%FMLA%'
,那麼只顯示EmlChgRsn。 - 第二個形象是困難的一部分 - 自員工休假以來,例如主管變更和薪資調整等,對就業進行了一些調整。我需要搜索最新的EmlChgRsn,這是與假期有關的 -
FMLAInt Beg
。
源數據可以大致如下:
OR
以下是一些示例數據以幫助您找出答案。請注意,我的第一遍傳遞簡單數據 - 如果您執行一兩次傳球或做一些事情想要一次更新所有內容,則無關緊要。我只需要得到'呃完成:)謝謝你的幫助!
--Create temp table to update
CREATE TABLE #JobInfo (
Emp varchar(10) NULL
,LeaveReason varchar(50) NULL
);
--Insert primer record with emp id's
INSERT INTO #JobInfo
VALUES (3750, '')
,(3752, '')
--Create source data table
CREATE TABLE #Employment (
Eml varchar(1) NULL
,EmlChgRsn varchar(50) NULL
,EmlEfdDt varchar(10) NULL
,Emp varchar(10) NULL
,EmpSts varchar(50) NULL
);
--Populate source data table with mock data
INSERT INTO #Employment
VALUES ('1', 'FMLAFull Beg', CONVERT(VARCHAR(10), DATEADD(MONTH, -6, GETDATE()), 101), '3752', 'On Leave')
,('1', 'Salary', CONVERT(VARCHAR(10), DATEADD(MONTH, -5, GETDATE()), 101), '3752', 'On Leave')
,('1', 'TeamChange', CONVERT(VARCHAR(10), DATEADD(MONTH, -4, GETDATE()), 101), '3752', 'On Leave')
,('1', 'Salary', CONVERT(VARCHAR(10), DATEADD(MONTH, -3, GETDATE()), 101), '3752', 'On Leave')
,('1', 'FMLAInt Beg', NULL, '3752', 'On Leave')
,('1', 'Salary', CONVERT(VARCHAR(10), DATEADD(MONTH, -7, GETDATE()), 101), '3750', 'Active')
,('1', 'FMLAFull Beg', CONVERT(VARCHAR(10), DATEADD(MONTH, -6, GETDATE()), 101), '3750', 'On Leave')
,('1', 'Salary', CONVERT(VARCHAR(10), DATEADD(MONTH, -5, GETDATE()), 101), '3750', 'On Leave')
,('1', 'New Supervisor', CONVERT(VARCHAR(10), DATEADD(MONTH, -4, GETDATE()), 101), '3750', 'On Leave')
,('1', 'FMLAInt Beg', CONVERT(VARCHAR(10), DATEADD(MONTH, -3, GETDATE()), 101), '3750', 'On Leave')
,('1', 'New Supervisor', NULL, '3750', 'On Leave')
-- **First pass as updating the easy records
UPDATE #JobInfo
SET LeaveReason = (SELECT CASE WHEN (EmlChgRsn LIKE '%FMLA%Beg%' OR EmlChgRsn LIKE '%Leave%Beg%')
AND EmpSts = 'On Leave' THEN EmlChgRsn
ELSE '' END
FROM #Employment
WHERE #Employment.Emp = #JobInfo.Emp
AND EmlEfdDt IS NULL
AND Eml = 1)
SELECT *
FROM #JobInfo
DROP TABLE #JobInfo
DROP TABLE #Employment
我看到這給出了所需的輸出。我太累了,不能單獨挑選,以確保它是我所需要的,但我明天早上就會明白並接受是否結賬。謝謝傑森! –