在 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;
我必须包含 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;