I have this select on a view:
x
SELECT
T1.ID AS [ID],
T1.A AS [A],
T1.B AS [B],
T4.C AS [C],
ISNULL(NULLIF(T3.D, ''), T2.D) AS [D],
T1.E AS [E],
T1.F AS [F],
T1.G AS [G]
FROM T1
INNER JOIN T2 ON T2.X = T1.X
INNER JOIN T3 ON T3.Y = T2.Y
RIGHT JOIN T4 ON T4.Z = T3.Z
And get this:
║ ID ║ A ║ B ║ C ║ D ║ E ║ F ║ G ║
╠══════╬══════╬══════╬══════╬══════╬══════╬══════╬══════╬
║ 1 ║ 3 ║ 4 ║ 1000 ║ X ║ 1 ║ 1 ║ 1 ║
║ 1 ║ 3 ║ 4 ║ 2000 ║ Y ║ 1 ║ 1 ║ 1 ║
║ NULL ║ NULL ║ NULL ║ 3000 ║ NULL ║ NULL ║ NULL ║ NULL ║
And I want that the last row be like this:
║ 1 ║ 3 ║ 4 ║ 3000 ║ Z ║ 1 ║ 1 ║ 1 ║
That is, the values of all columns equal to the other rows, except column ‘C’ and column ‘D’. The value of column D is obtained from T2.D
How can I do? Thanks.
Advertisement
Answer
Without any sample data to use I would suggest lag()
may be of use in this exact scenario, such as
select
IsNull(T1.ID, Lag(T1.ID) over(order by T4.C)) as [ID],
IsNull(T1.A, Lag(T1.A) over(order by T4.C))) as [A],
IsNull(T1.B, Lag(T1.B) over(order by T4.C))) as [B],
T4.C as [C],
IsNull(NullIf(T3.D, ''), T2.D) as [D],
IsNull(T1.E, Lag(T1.E) over(order by T4.C))) as [E],
IsNull(T1.F, Lag(T1.F) over(order by T4.C))) as [F],
IsNull(T1.G, Lag(T1.G) over(order by T4.C))) as [G],
from T1
inner join T2 on T2.X = T1.X
inner join T3 on T3.Y = T2.Y
right join T4 on T4.Z = T3.Z