1

我想前進色下一列,如果需要的列是空的,但是我使用COALESCE函數,但我無法得到預期的結果移動列到明年,如果空

下面是我的表結構

ID.  Level1. Level2. Level3 Level5 
1.   Xyz.  Null.  Null.  Null 
2.   Abc.  Xyz.  Null.  Null 
3.   Mno.  Abc.  Xyz.  Null 
4.   Ggg.  Mno.  Abc.  Xyz 

預期結果如下

ID.  Level1. Level2. Level3 Level5 
1.   Null. Null.  Null.  Xyz 
2.   Null. Null.  Abc.  Xyz 
3.   Null. Mno.  Abc.  Xyz 
4.   Ggg.  Mno.  Abc.  Xyz 
+0

請張貼DML,DDL像在由Jason答案,它幫助了很多 – TheGameiswar

回答

1

雖然你可以做到這一點與coalesce(),另一種方法是假笑(信不信由你):

select t.*, lv.* 
from t outer apply 
    (select max(case when l = 1 then lev end) as level5, 
      max(case when l = 2 then lev end) as level4, 
      max(case when l = 3 then lev end) as level3, 
      max(case when l = 4 then lev end) as level2, 
      max(case when l = 5 then lev end) as level1    
     from (select lev, row_number() over (order by l desc) as l 
      from (values (1, level1), (2, level2), (3, level3), (4, level4), (5, level5) v(l, lev) 
      where lev is not null 
      ) l 
    ) lv; 

邏輯是將每行上的數據取消轉移並重新聚合非NULL值。

+0

我針對我的測試數據運行了解決方案。而不是將值轉移到右側,它只是顛倒了L1 - > L4到L4 - > L1的列順序...對不起,無法找到發佈結果的方法,以便它們在此區域可讀。 –

+0

其實,以前我錯了......正確的值在正確的列下。他們以相反順序顯示的事實讓我失望了。 Mea Culpa。 –

1

這看起來像它的產生預期的結果...

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