2017-05-31 48 views
0

必須包含2017-2020年的數據。但是,對於一些記錄,這些年沒有數據。有沒有一種方法來填充它?在SQL Server 2008R2中創建缺失年份的數據

這裏的樣本表結構:

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之間的差異與年額外的行失蹤,0爲GAAPRevenue。

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) 

回答

1

這有一個所需年份(年CTE)的手動列表,並獲得不同租約(租約CTE)的清單。然後,您交叉連接兩個列表以獲取所有必需的行,將外部連接留在現有行,並忽略任何具有匹配的行。這個選擇可以讓你獲得所有缺失的數據。

我已經添加了插入以將缺失的行添加回#Temp,但將該行註釋掉了。要實際添加數據,只需在運行之前取消註釋該行。

如果您願意,也可以使用內聯子查詢替換CT​​E來編寫此代碼。

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; 
相關問題