I know there's a bunch of "Flatten" questions, but they don't seem to fit this requirement.
Given a table of data with 4 columns, all of which can have null's, I need to be able to specify a specific depth value and get a single record back that will search at that depth and lower (towards 1) to fill in the gaps.
COL1 COL2 COL3 COL4 DEPTH
--------- ------------- ------------ ------ -----------
NULL NULL Manager NULL 9
NULL NULL NULL NULL 8
Jack NULL NULL 36 7
NULL NULL Employed 28 6
James NULL NULL 15 5
NULL Ericson NULL NULL 4
NULL NULL NULL 23 3
Jack NULL NULL NULL 2
John Smith Unemployed 45 1
Requesting a depth of 5 for example, should return:
COL1 COL2 COL3 COL4 DEPTH
--------- ----------- -------------- ------ -----
James Ericson Unemployed 15 5
Sample setup:
DECLARE @Table TABLE
(
[COL1] varchar(30) NULL,
[COL2] varchar(30) NULL,
[COL3] varchar(30) NULL,
[COL4] varchar(30) NULL,
[DEPTH] int NOT NULL
);
INSERT INTO @Table
SELECT Null , Null , 'Manager' , Null , 9 UNION ALL
SELECT Null , Null , Null , Null , 8 UNION ALL
SELECT 'Jack' , Null , Null , '36' , 7 UNION ALL
SELECT Null , Null , 'Employed' , '28' , 6 UNION ALL
SELECT 'James' , Null , Null , '15' , 5 UNION ALL
SELECT Null , 'Ericson' , Null , Null , 4 UNION ALL
SELECT Null , Null , Null , '23' , 3 UNION ALL
SELECT 'Jack' , Null , Null , Null , 2 UNION ALL
SELECT 'John' , 'Smith' , 'Unemployed' , '45' , 1;
SELECT * FROM @Table ORDER BY DEPTH DESC;
Current working code:
DECLARE @Depth int = 5;
SELECT
[COL1] = ( SELECT TOP(1) [COL1] FROM @Table WHERE [DEPTH] <= @Depth AND [COL1] IS NOT Null ORDER BY DEPTH DESC ),
[COL2] = ( SELECT TOP(1) [COL2] FROM @Table WHERE [DEPTH] <= @Depth AND [COL2] IS NOT Null ORDER BY DEPTH DESC ),
[COL3] = ( SELECT TOP(1) [COL3] FROM @Table WHERE [DEPTH] <= @Depth AND [COL3] IS NOT Null ORDER BY DEPTH DESC ),
[COL4] = ( SELECT TOP(1) [COL4] FROM @Table WHERE [DEPTH] <= @Depth AND [COL4] IS NOT Null ORDER BY DEPTH DESC );
Is there a better way to retrieve the data? I've tried a few things but nothing else has even worked, let alone better.