2017-04-03 32 views
2

我已經OppTable如何使用多個條件


ID   actualclosedate status 
-------------------------------------- 
    1   10-March Won 
    2   11-June  Lost 
    3   13-July  Open 

我有階段變化

-------------------------------------- 
    ID   stage  createdon 
-------------------------------------- 
    1   Propsect 1-Jan   
    1   Qualify  15-Jan  
    1   Develop  25-Jan  
    2   Qualify  9-Feb  
    2   Develop  7-March  
    3   Prospect 9-April 
    3   Prospect 9-April 

我如何填寫新的列中的NULL值生成的基於填充鉛窗口空值在多個標準。 例如:如果奧普是韓元/ LOST把截止日期 如果奧普是開放式認沽今天日期

預期結果:

-------------------------------------- 
    OppID  Stage  createdon newcolumn 
-------------------------------------- 
    1   Propsect 1-Jan  15-Jan 
    1   Qualify  15-Jan  25-Jan 
    1   Develop  25-Jan  10-March ---(closedate for Wonn Opp1) 
    2   Qualify  9-Feb  7-March 
    2   Develop  7-March  11-june ---(closedate for lost Opp2) 
    3   Prospect 9-April  10-April 
    3   Qualify  10-April  4/2/2017----(todaydate for Open Opp3) 

使用此查詢,將會得到我要開實際結束時間,但我想今天日期

Select * 
     ,NewColumn = COALESCE(Lead(A.createdon) over (Partition By A.ID Order By A.CreatedOn),B.actualclosedate) 

From stagechange A 
Join OppTable B on A.ID=B.ID 
+0

此查詢不編譯,我很害怕。什麼是「B.actualclosedate」? –

+0

如果你今天想要打開狀態,你可以在'COALESCE'內使用'CASE WHEN status ='Open'THEN Current_Date ELSE B.actualclosedate END)'而不是'B.actualclosedate'。 – dnoeth

回答

2

你可以試試這個查詢:

WITH cte AS (
    SELECT a.ID, a.Stage, a.CreatedOn, b.CloseDate, b.Status, 
      LEAD(a.CreatedOn) OVER (PARTITION BY a.ID ORDER BY a.CreatedOn) ld, 
      ROW_NUMBER() OVER (PARTITION BY a.ID ORDER BY a.CreatedOn DESC) rn, 
      DENSE_RANK() OVER (PARTITION BY a.ID ORDER BY a.CreatedOn DESC) dr 
    FROM stagechange a 
    INNER JOIN OppTable b 
     ON a.ID = b.ID 
) 
SELECT t.ID, t.Stage, t.CreatedOn, 
     CASE WHEN (t.rn <> 1 OR t.rn = t.dr) AND t.ld IS NOT NULL THEN t.ld 
      WHEN t.Status <> 'Open' THEN t.CloseDate 
      ELSE GETDATE() 
     END AS newcolumn 
FROM cte t 
ORDER BY t.ID, t.CreatedOn; 

我發現使用ROW_NUMBER()DENSE_RANK()對於處理給定的ID可以具有多個等效關閉日期的邊緣情況是必要的。在這種情況下,我們需要一些方法來確定哪一個是最古老的。

輸出:

enter image description here

演示在這裏:

Rextester

相關問題