Naz*_*Naz 1 sql sql-server sql-server-2012
我有下表称'费率':
Valid From Employee Rate
----------------------------------
01/03/2010 1M 50
01/03/2010 2M 75
01/10/2015 1M 55
01/10/2015 2M 80
Run Code Online (Sandbox Code Playgroud)
我还有一个名为'Jobs'的下表:
ID Employee OpenedDate Rate
100000 1M 05/06/2012
100000 2M 08/09/2018
Run Code Online (Sandbox Code Playgroud)
如何从Rates表中检索到Jobs表中的比率,其中OpenedDate大于或等于当前的ValidFrom日期且小于或等于下一个ValidFrom日期,其中Employee也匹配?
所以我最终会:
ID Employee OpenedDate Rate
100000 1M 05/06/2012 50
100000 2M 08/09/2018 80
Run Code Online (Sandbox Code Playgroud)
希望我解释说好的干杯可以提供任何帮助!
ps不知道如何在Stack中显示上面的数据作为表格布局,一直在寻找帮助,但我不知道如何?
如果您无法修改表以添加"ValidTo"列,则必须使用LEADWindow函数动态创建一个
CREATE TABLE Table1
([Valid From] DATETIME, Employee varchar(2), Rate int)
;
INSERT INTO Table1
([Valid From], Employee, Rate)
VALUES
('2010-01-03 00:00:00', '1M', 50),
('2010-01-03 00:00:00', '2M', 75),
('2015-01-10 00:00:00', '1M', 55),
('2015-01-10 00:00:00', '2M', 80)
;
CREATE TABLE Table2
(ID int, Employee varchar(2), OpenedDate DATETIME, Rate int)
;
INSERT INTO Table2
(ID, Employee, OpenedDate, Rate)
VALUES
(100000, '1M', '2012-05-06 00:00:00', NULL),
(100000, '2M', '2018-08-09 00:00:00', NULL)
;
;WITH cteValidToAdded
AS(
SELECT
T1.[Valid From]
,[ValidTo] = ISNULL(LEAD(T1.[Valid From])OVER(PARTITION BY T1.Employee ORDER BY T1.[Valid From], T1.Employee),'25001212') --Some date in distance future
,T1.Employee
,T1.Rate
FROM dbo.Table1 T1
)
SELECT
T2.ID
,T2.Employee
,OpenedDate = CONVERT(VARCHAR(12), T2.OpenedDate, 101)
,V.Rate
FROM dbo.Table2 T2
LEFT JOIN cteValidToAdded V ON V.Employee = T2.Employee
AND T2.OpenedDate >= V.[Valid From] AND T2.OpenedDate < V.ValidTo
Run Code Online (Sandbox Code Playgroud)
产量
ID Employee OpenedDate Rate
100000 1M 05/06/2012 50
100000 2M 08/09/2018 80
Run Code Online (Sandbox Code Playgroud)