這看起來像它的產生預期的結果...
IF OBJECT_ID('tempdb..#TestDate', 'U') IS NOT NULL
DROP TABLE #TestDate;
CREATE TABLE #TestDate (
ID CHAR(2) NOT NULL,
Level_1 VARCHAR(10) NULL,
Level_2 VARCHAR(10) NULL,
Level_3 VARCHAR(10) NULL,
Level_4 VARCHAR(10) NULL
);
INSERT #TestDate (ID, Level_1, Level_2, Level_3, Level_4) VALUES
('1.', 'Xyz.', Null, Null, Null),
('2.', 'Abc.', 'Xyz.', Null, Null),
('3.', 'Mno.', 'Abc.', 'Xyz.', Null),
('4.', 'Ggg.', 'Mno.', 'Abc.', 'Xyz');
-- SELECT * FROM #TestDate td;
WITH
cte_NewLevel AS (
SELECT
td.ID,lvl.LevelNum, lvl.LebelValue,
NewLevel = 5 - COUNT(lvl.LebelValue) OVER (PARTITION BY td.ID ORDER BY lvl.LevelNum DESC ROWS UNBOUNDED PRECEDING)
FROM
#TestDate td
CROSS APPLY (VALUES (1, td.Level_1), (2, td.Level_2), (3, td.Level_3), (4, td.Level_4)) lvl (LevelNum, LebelValue)
)
SELECT
nl.ID,
Level_1 = MAX(CASE WHEN nl.NewLevel = 1 THEN nl.LebelValue END),
Level_2 = MAX(CASE WHEN nl.NewLevel = 2 THEN nl.LebelValue END),
Level_3 = MAX(CASE WHEN nl.NewLevel = 3 THEN nl.LebelValue END),
Level_4 = MAX(CASE WHEN nl.NewLevel = 4 THEN nl.LebelValue END)
FROM
cte_NewLevel nl
GROUP BY
nl.ID;
結果...
ID Level_1 Level_2 Level_3 Level_4
---- ---------- ---------- ---------- ----------
1. NULL NULL NULL Xyz.
2. NULL NULL Abc. Xyz.
3. NULL Mno. Abc. Xyz.
4. Ggg. Mno. Abc. Xyz
請張貼DML,DDL像在由Jason答案,它幫助了很多 – TheGameiswar