2016-05-17 52 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

相关问题