在 SQL Server 2008R2 中为缺失年份创建数据

Create Data for missing years in SQL Server 2008R2

我必须包含 2017-2020 年的数据。但是,有些记录没有这些年的数据。有没有办法填充它?

这是示例 table 结构:

 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),并获取不同租赁的列表(Leases CTE)。然后交叉连接两个列表以获取所有必需的行,左外部连接到现有行,并忽略任何匹配的行。这 select 为您提供了所有缺失的数据。

我添加了插入以将缺失的行添加回#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;