使用别名计算两列之间的百分比差异

时间:2018-08-17 04:45:14

标签: sql-server tsql sql-server-2016

我在T-SQL中有这部分代码。

.bat

它们是两列,一列称为“定义年份VS上一年度(个人)”,另一列称为“定义年份VS上一年度(组)”。这两个列都产生一个带有%符号的数字,例如90%或0%,可以是任意数字。

我想添加另一列,该列将计算每列中两个值之间的总差。我找到了这个To calculate sum() two alias named columns - in sql,但是我不想使用CTE。我也尝试过以下代码:

CAST(COALESCE(ISNULL(100.0 * (CTEDefinedYear.[Individual Cases]-CTEPreviousYear.[Individual Cases Last Year])
           /NULLIF(CTEDefinedYear.[Individual Cases],0),0),0) AS VARCHAR) + ' ' + '%'
           AS 'Defined Year VS Previous Year (Individual)',
CAST(COALESCE(ISNULL(100.0 * (CTEDefinedYear.[Group Cases]-CTEPreviousYear.[Group Cases Last Year])
           /NULLIF(CTEDefinedYear.[Group Cases],0),0),0) AS VARCHAR) + ' ' + '%'
           AS 'Defined Year VS Previous Year (Group)'

并得到这些错误。

CAST(ISNULL([Defined Year VS Previous Year (Individual)] - [Defined Year VS Previous Year (Group)]) * 100
            / [Defined Year VS Previous Year (Individual)])

我不确定在这里还有什么可做的,我觉得这是基本的事情,但是似乎无法解决。

1 个答案:

答案 0 :(得分:1)

是的,这很烦人,但您需要具体化计算(在表,CTE等中)或复制并粘贴计算表达式(没有其他选项,是的,它看起来不太好)。

其原因是Logical Processing Order of the SELECT statement,即:

enter image description here

所以,我们有:

  

此顺序确定何时进行一步定义的对象   可用于后续步骤中的条款。 ...因为SELECT   子句是步骤8,其中定义的任何列别名或派生列   该子句不能被前面的子句引用。但是,他们   可以由后续子句(例如ORDER BY子句)引用。

SELECT语句中定义别​​名时,由于尚未定义别名,因此不允许在同一阶段使用它们,对吗?

这就是为什么您不能在SELECT子句中使用排名函数(再次在WHERE中定义)的原因-处理WHERE子句时,尚未评估排名函数。

再说一次,我去过很多次-您无能为力。您需要实现计算或再次复制它。