Sql server 2008 r2 为SQL Server 2008R2中缺失的年份创建数据

Sql server 2008 r2 为SQL Server 2008R2中缺失的年份创建数据,sql-server-2008-r2,recursive-query,Sql Server 2008 R2,Recursive Query,我必须包含2017-2020年的数据。然而,对于一些记录,这些年没有数据。有没有办法填充它 下面是示例表结构: CREATE TABLE #Temp ( RefLeaseAssumptionID VARCHAR(30), Scenario VARCHAR(15), RefBuildingID VARCHAR(15), BuildingName Varchar(50), TenantName varchar(50), UnitID

我必须包含2017-2020年的数据。然而,对于一些记录,这些年没有数据。有没有办法填充它

下面是示例表结构:

 CREATE TABLE #Temp
 (
 RefLeaseAssumptionID    VARCHAR(30),
 Scenario   VARCHAR(15),
 RefBuildingID    VARCHAR(15),
 BuildingName           Varchar(50),
 TenantName    varchar(50),
 UnitID      varchar(15),
 StartDate   date,
 EndDate  date,
 Area int,
 Years  int,
 GAAPRevenue  int
)

INSERT INTO #Temp VALUES ('20400-TSPECTENB-LSPECTENB-0190','2017_B03', '20400', 'ABCD-123', 'New Tenant (spec)',  '2700', '2019-05-01', '2024-04-30', 45788, 2019, 800000 ) 
INSERT INTO #Temp VALUES ('20400-TSPECTENB-LSPECTENB-0190','2017_B03', '20400', 'ABCD-123', 'New Tenant (spec)',  '2700', '2019-05-01', '2024-04-30', 45788, 2020, 900000 ) 
INSERT INTO #Temp VALUES ('45000-TSPECTENB-LSPECTENB-0100','2017_B03', '45000', 'WXYZ-123', 'New Tenant (spec)',  '0100', '2017-05-01', '2018-05-30', 20000, 2017, 300000 ) 
INSERT INTO #Temp VALUES ('45000-TSPECTENB-LSPECTENB-0100','2017_B03', '45000', 'WXYZ-123', 'New Tenant (spec)',  '0100', '2017-05-01', '2018-05-30', 20000, 2018, 350000 ) 
INSERT INTO #Temp VALUES ('25000-TSPECTENB-LSPECTENB-1','2017_B03', '25000', 'XZZZ-123', 'New Tenant (spec)',  '0300', '2017-05-01',    '2020-10-31', 10000, 2018, 100000 ) 
INSERT INTO #Temp VALUES ('25000-TSPECTENB-LSPECTENB-1','2017_B03', '25000', 'XZZZ-123', 'New Tenant (spec)',  '0300', '2017-05-01',    '2020-10-31', 10000, 2019, 125000 ) 
INSERT INTO #Temp VALUES ('25000-TSPECTENB-LSPECTENB-1','2017_B03', '25000', 'XZZZ-123', 'New Tenant (spec)',  '0300', '2017-05-01',    '2020-10-31', 10000, 2020, 170000 ) 
我想要的结果是:

请注意#temp和#temp2之间的差异是缺少年份的额外行,而GAAPRevenue为0

CREATE TABLE #Temp2
(
 RefLeaseAssumptionID    VARCHAR(30),
 Scenario   VARCHAR(15),
 RefBuildingID    VARCHAR(15),
 BuildingName           Varchar(50),
 TenantName    varchar(50),
 UnitID      varchar(15),
 StartDate   date,
 EndDate  date,
 Area int,
 Years  int,
 GAAPRevenue  int
)

INSERT INTO #Temp2 VALUES ('20400-TSPECTENB-LSPECTENB-0190','2017_B03', '20400', 'ABCD-123', 'New Tenant (spec)',  '2700', '2019-05-01',    '2024-04-30', 45788, 2017, 0 ) 
INSERT INTO #Temp2 VALUES ('20400-TSPECTENB-LSPECTENB-0190','2017_B03', '20400', 'ABCD-123', 'New Tenant (spec)',  '2700', '2019-05-01',    '2024-04-30', 45788, 2018, 0 ) 
INSERT INTO #Temp2 VALUES ('20400-TSPECTENB-LSPECTENB-0190','2017_B03', '20400', 'ABCD-123', 'New Tenant (spec)',  '2700', '2019-05-01',    '2024-04-30', 45788, 2019, 800000 ) 
INSERT INTO #Temp2 VALUES ('20400-TSPECTENB-LSPECTENB-0190','2017_B03', '20400', 'ABCD-123', 'New Tenant (spec)',  '2700', '2019-05-01',    '2024-04-30', 45788, 2020, 900000 ) 
INSERT INTO #Temp2 VALUES ('45000-TSPECTENB-LSPECTENB-0100','2017_B03', '45000', 'WXYZ-123', 'New Tenant (spec)',  '0100', '2017-05-01',    '2018-05-30', 20000, 2017, 300000 ) 
INSERT INTO #Temp2 VALUES ('45000-TSPECTENB-LSPECTENB-0100','2017_B03', '45000', 'WXYZ-123', 'New Tenant (spec)',  '0100', '2017-05-01',    '2018-05-30', 20000, 2018, 350000 ) 
INSERT INTO #Temp2 VALUES ('45000-TSPECTENB-LSPECTENB-0100','2017_B03', '45000', 'WXYZ-123', 'New Tenant (spec)',  '0100', '2017-05-01',    '2018-05-30', 20000, 2019, 0 ) 
INSERT INTO #Temp2 VALUES ('45000-TSPECTENB-LSPECTENB-0100','2017_B03', '45000', 'WXYZ-123', 'New Tenant (spec)',  '0100', '2017-05-01',    '2018-05-30', 20000, 2020, 0 ) 
INSERT INTO #Temp2 VALUES ('25000-TSPECTENB-LSPECTENB-1','2017_B03', '25000', 'XZZZ-123', 'New Tenant (spec)',  '0300', '2017-05-01',   '2020-10-31', 10000, 2017, 0 ) 
INSERT INTO #Temp2 VALUES ('25000-TSPECTENB-LSPECTENB-1','2017_B03', '25000', 'XZZZ-123', 'New Tenant (spec)',  '0300', '2017-05-01',   '2020-10-31', 10000, 2018, 100000 ) 
INSERT INTO #Temp2 VALUES ('25000-TSPECTENB-LSPECTENB-1','2017_B03', '25000', 'XZZZ-123', 'New Tenant (spec)',  '0300', '2017-05-01',   '2020-10-31', 10000, 2019, 125000 ) 
INSERT INTO #Temp2 VALUES ('25000-TSPECTENB-LSPECTENB-1','2017_B03', '25000', 'XZZZ-123', 'New Tenant (spec)',  '0300', '2017-05-01',   '2020-10-31', 10000, 2020, 170000 ) 

这有一个所需年份(年份CTE)的手动列表,并获得不同租约(租约CTE)的列表。然后交叉连接两个列表以获得所有必需的行,将外部连接到现有行,并忽略任何匹配的行。此选择将获取所有缺少的数据

我添加了insert以将缺少的行添加回#Temp,但注释掉了该行。要实际添加数据,只需在运行之前取消对行的注释

如果愿意的话,您也可以用内联子查询替换CTE来编写此代码

With Years as 
(Select 2017 as YearNo 
UNION ALL Select 2018
UNION ALL Select 2019
UNION ALL Select 2020
), Leases as (
Select distinct RefLeaseAssumptionID, Scenario, RefBuildingID, BuildingName, TenantName, UnitID, StartDate, EndDate, Area
From #Temp1
)
--Insert into #Temp (RefLeaseAssumptionID, Scenario, RefBuildingID, BuildingName, TenantName, UnitID, StartDate, EndDate, Area, Year, GAAPRevenue
Select L.RefLeaseAssumptionID, L.Scenario, L.RefBuildingID, L.BuildingName, L.TenantName, L.UnitID, L.StartDate, L.EndDate, L.Area, Y.YearNo, 0
from Leases L
    Cross Join Years Y
    left outer join #Temp T1 on T1.RefLeaseAssumptionID = L.RefLeaseAssumptionID and T1.Years = Y.YearNo
Where T1.RefLeaseAssumptionID is Null;