如何从多个SQL变量中选取最大值并存储到新变量
从多个变量中获取最大值的正确SQL写法
你的代码有两个关键问题:
- 用
VALUES构造临时数据集时,既没给列起别名,也没给整个派生表起别名,SQL Server无法识别要聚合的目标列。 - 错误地对未赋值的
@MaxValue调用MAX函数,实际应该是对@aBNT、@aGNT、@aBTA这三个变量的值取最大值,再赋值给@MaxValue。
修正后的代码如下:
DECLARE @BNTL FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @BNTT FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @BNTC FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @GNTL FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @GNTT FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @GNTC FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @BTAC FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @BTAT FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @BTAL FLOAT = (SELECT [numericvalue] FROM [table] WHERE [condition]) DECLARE @aBNT FLOAT DECLARE @aGNT FLOAT DECLARE @aBTA FLOAT DECLARE @MaxValue FLOAT SELECT @aBNT = 1.0*((@BNTC/@BNTT)/@BNTL) SELECT @aGNT = 1.0*((@GNTC/@GNTT)/@GNTL) SELECT @aBTA = 1.0*((@BTAC/@BTAT)/@BTAL) -- 修正部分:给VALUES的列起别名,派生表起别名,同时将MAX结果赋值给@MaxValue SELECT @MaxValue = MAX(Value) FROM (VALUES (@aBNT),(@aGNT),(@aBTA)) AS TempTable(Value) -- 可选:验证结果 SELECT @MaxValue AS 最大值
另外,如果你使用的是SQL Server 2022及以上版本,还可以用GREATEST函数简化写法,直接比较多个变量:
SET @MaxValue = GREATEST(@aBNT, @aGNT, @aBTA)
这个函数会直接返回参数中的最大值,代码更简洁。
内容的提问来源于stack exchange,提问作者Fedep
相关产品推荐
相关产品推荐

