我在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)])
我不确定在这里还有什么可做的,我觉得这是基本的事情,但是似乎无法解决。
答案 0 :(得分:1)
是的,这很烦人,但您需要具体化计算(在表,CTE等中)或复制并粘贴计算表达式(没有其他选项,是的,它看起来不太好)。
其原因是Logical Processing Order of the SELECT statement,即:
所以,我们有:
此顺序确定何时进行一步定义的对象 可用于后续步骤中的条款。 ...因为SELECT 子句是步骤8,其中定义的任何列别名或派生列 该子句不能被前面的子句引用。但是,他们 可以由后续子句(例如ORDER BY子句)引用。
在SELECT
语句中定义别名时,由于尚未定义别名,因此不允许在同一阶段使用它们,对吗?
这就是为什么您不能在SELECT
子句中使用排名函数(再次在WHERE
中定义)的原因-处理WHERE
子句时,尚未评估排名函数。
再说一次,我去过很多次-您无能为力。您需要实现计算或再次复制它。