【发布时间】:2017-08-26 05:20:06
【问题描述】:
我有一个疑问,我很难理解。我需要根据以下条件更新临时表中的字段:
- 如果员工目前正在休假,我将获得休假原因
- 如果 EmpSts 为
On Leave,则认为员工休假 - 请假原因来自 EmlChgRsn(就业变更原因)列,因此,如果员工请假,则在本例中,所需的输出将是
FMLAFull Beg或FMLAInt Beg -
EmlEfdDt IS NULL是该员工的最新条目的记录。 - 下面显示了两种不同类型的数据场景。第一张图片很简单——如果是
EmlEfdDt IS NULL and EmlSts = "On Leave" and EmlChgRsn LIKE '%FMLA%',则只显示EmlChgRsn。 - 第二张图是最难的部分——员工休假后对就业进行了一些调整,例如主管变动和工资变动。我需要搜索与请假相关的最新 EmlChgRsn——在这种情况下为
FMLAInt Beg。
源数据如下所示:
或
以下是一些示例数据,可帮助您弄清楚这一点。请注意我在获取简单数据时的第一次传递——如果你做一两次传递或做一些花哨的事情来一次更新它,这并不重要。我只需要完成 :) 谢谢你的帮助!!
--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
【问题讨论】:
标签: sql sql-server tsql