2016-05-17 48 views
0
i.Notes, SUM(l.Discount) AS Dcount, i.DiscDate, i.DueDate, i.UIMth, i.UISeq, poj.Job, poj.Description, i.UniqueAttchID, i.ReviewerGroup AS RevGrp, SUM(l.GrossAmt) 
        AS GrossAmt, v.PayTerms, dbo.HQPT.DiscRate, i.InvTotal, DATEDIFF(day,getdate(),i.DiscDate) AS DiscDays, 
--Trying to use the DiscDays and Dcount here  
        if DiscDays, between '20' and '11' THEN sum(Dcount) as YelDisc 

我希望有人能幫助我。我對T-SQL非常陌生。我相信我所需要的這裏是一個子查詢,但我不知道如何格式化正確在同一個select語句中選擇別名

謝謝

回答

0

不能引用別名在同一查詢中,但是你可以做的是:

 select 
     i.Notes, 
     SUM(l.Discount) AS Dcount, 
     i.DiscDate, 
     i.DueDate, 
     i.UIMth, 
     i.UISeq, 
     poj.Job, 
     poj.Description, 
     i.UniqueAttchID, 
     i.ReviewerGroup AS RevGrp, 
     SUM(l.GrossAmt) AS GrossAmt, 
     v.PayTerms, 
     dbo.HQPT.DiscRate, 
     i.InvTotal, 
     DATEDIFF(day,getdate(),i.DiscDate) AS DiscDays, 

    --Trying to use the DiscDays and Dcount here  
     case 
      when DATEDIFF(day,getdate(),i.DiscDate) between '11' and '20'     THEN sum(Dcount) 
      when DATEDIFF(day,getdate(),i.DiscDate) between '20' and '40'   THEN sum(Dcount)/2 
      else 0 -- this is the default case that doesn't match your cases, it could return NULL 
     end as YelDisc 
+0

我增加了一些額外的案例澄清 –

+1

都鐸感謝您的幫助,您的建議工作正如我所需要的。額外的病例陳述是有幫助的。我還有一個問題。如果我希望'11'和'20'是YelDisc,'20'和'40'是GreDisc,那麼該聲明如何顯示?我知道我可以在同一個案例聲明中全部是圓頂,還是必須分別爲GreDisc編寫一個圓頂?再次感謝!! – Steve

+0

你必須把它放在不同的列上,在不同的case case state中,例如:'case when'11'和'20'之間的DATEDIFF(day,getdate(),i.DiscDate)THEN sum(Dcount)else null end as YelDisc,當DATEDIFF(day,getdate(),i.DiscDate)在'20'和'40'THEN sum(Dcount)/ 2 else null作爲GreDisc'的情況下,在where子句中查找不爲空的列。原因是你的模式(即列名和數據類型)不應該根據檢索到的數據而改變。 –

0
  1. IF是程序流程,而不是表達
  2. 您不能重複使用在另一列別名
  3. 當比較數值結果不加引號包圍常量

嘗試

CASE WHEN DATEDIFF(day,getdate(),i.DiscDate) between 20 and 11 
     THEN sum(Dcount) 
    ELSE 0 
END as YelDisc 

可能做一個子查詢重用別名,但對於這樣一個相對簡單的表達,並在結果中的列數設置它可能不值得。

+0

d士丹利感謝你的幫助。你的建議正好符合我的需要。乾杯!! – Steve