在其他别名中使用别名?

Using aliases in other aliases?

在别名中使用别名有没有更好的方法?

例如,我不相信我可以做类似 select ... sum(...) as sum1, sum(...) as sum2, (sum1 + sum2) as sum3

的事情

到目前为止,我需要为引用别名的任何新列保存所有这些子查询。例如,sum(...) as sum1, sum(...) as sum2 在一个查询中,保存为 q1,然后在一些新查询中,有 (q1.sum1 + q1.sum2) as sum3

有没有更聪明的方法来做到这一点?

您不能在别名中聚合别名。但是,您可以执行以下操作:

Select ...
      ,sum1 = sum( col1 ) 
      ,sum2 = sum( col2 ) 
      ,sum3 = sum( col1 + col2 )
 From  YourTable
 Group By ...

编辑 - 更新

Select *
      ,sum3 = sum1+sum2
 From  (
         Select ...
               ,sum1 = sum( {some complex case} ) 
               ,sum2 = sum( {some complex case} ) 
          From  YourTable
         Group By ...
       ) A
 

使用交叉应用重用代码

大多数人使用 CTE's/temp 表,但如果您需要像解析字符串时那样堆叠计算,这里有一个特别简洁的小技巧。不能将此技巧用于聚合函数(SUM、COUNT 等...),但可以将其用于字符串解析、数字运算、条件等...

Select A.*,B.Calc1,C.Calc2
FROM TableA AS A
CROSS APPLY (SELECT Calc1 = CASE WHEN...END) AS B /*Calculated column*/
CROSS APPLY (SELECT Calc2 = A.Col1 + B.Calc2 ) AS C /*Can reference columns in previous CROSS APPLY's*/