是否可以在相同的选择中重用聚合函数结果?

Posted

技术标签:

【中文标题】是否可以在相同的选择中重用聚合函数结果?【英文标题】:Is it possible to reuse aggregate functions results in the same select? 【发布时间】:2011-09-01 10:44:24 【问题描述】:

看看这个 TSQL 代码:

SELECT A, B, C, (MAX(A) - MAX(B))*C AS 'myCalculatedColumn',
dbo.[udf_GetBetaInv]((MAX(A) - MAX(B))*C, A, B, C) as 'BetaInv'
FROM dbo.MyTable
WHERE...

有没有办法让块:(MAX(A) - MAX(B))*C 只写一次并在 myCalculatedColumn 定义中使用,也可以作为同一语句中 udf 的参数。

我主要关心性能,不确定 SQL Server 是计算一次还是多次,但即使只计算一次,最好让 SQL 代码更具可读性和紧凑性,并且只有一个地方可以修改,以防我们应该更改一个公式。

编辑。最近有人建议我使用 CROSS APPLY 来解决完全相同的问题:simplify SQL statement by using CTE

【问题讨论】:

【参考方案1】:

您可以在 CTE 中定义它

WITH CTE AS
(
SELECT A,
       B,
       C,
       ( MAX(A) - MAX(B) ) * C AS myCalculatedColumn
FROM   dbo.MyTable  
WHERE...
)
SELECT *,
       dbo.[udf_GetBetaInv](myCalculatedColumn, A, B, C) as 'BetaInv'
from CTE

或者一个不那么冗长的方法是define it in a CROSS APPLY。 CTE 适用于更多情况。

【讨论】:

很酷的作品就像一个魅力,同样的表现,但更干净的代码,谢谢!!

以上是关于是否可以在相同的选择中重用聚合函数结果?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 MyBatis 中使用聚合函数

如何基于多个唯一列选择数据而不在结果集中的其余列上应用聚合函数

C++类的组合和聚合

尝试使用 linq 聚合函数

PostgreSQL中的选择或布尔聚合函数

26《MySQL 教程》聚合函数(聚合函数 MIN、MAX)