我有两个变量,一个叫PaidThisMonth,另一个叫OwedPast。它们都是SQL中一些子查询的结果。我如何选择两者中较小的一个,并将其作为一个名为PaidForPast的值返回?
MIN函数作用于列,而不是变量。
我有两个变量,一个叫PaidThisMonth,另一个叫OwedPast。它们都是SQL中一些子查询的结果。我如何选择两者中较小的一个,并将其作为一个名为PaidForPast的值返回?
MIN函数作用于列,而不是变量。
当前回答
这里有一个技巧,如果你想计算最大值(字段,0):
SELECT (ABS(field) + field)/2 FROM Table
如果字段为负,则返回0,否则返回字段。
其他回答
使用临时表插入值范围,然后从存储过程或UDF中选择临时表的最小/最大值。这是一个基本的结构,所以可以根据需要随意修改。
例如:
CREATE PROCEDURE GetMinSpeed() AS
BEGIN
CREATE TABLE #speed (Driver NVARCHAR(10), SPEED INT);
'
' Insert any number of data you need to sort and pull from
'
INSERT INTO #speed (N'Petty', 165)
INSERT INTO #speed (N'Earnhardt', 172)
INSERT INTO #speed (N'Patrick', 174)
SELECT MIN(SPEED) FROM #speed
DROP TABLE #speed
END
我遇到的情况是,我必须在一次更新中找到最多4个复杂的选择。 用这种方法,你可以有很多你喜欢的!
您还可以用其他选择替换这些数字
select max(x)
from (
select 1 as 'x' union
select 4 as 'x' union
select 3 as 'x' union
select 2 as 'x'
) a
更复杂的用法
@answer = select Max(x)
from (
select @NumberA as 'x' union
select @NumberB as 'x' union
select @NumberC as 'x' union
select (
Select Max(score) from TopScores
) as 'x'
) a
我相信UDF有更好的性能。
这里有一个技巧,如果你想计算最大值(字段,0):
SELECT (ABS(field) + field)/2 FROM Table
如果字段为负,则返回0,否则返回字段。
使用CASE语句。
本页中的例子B应该接近你要做的事情: http://msdn.microsoft.com/en-us/library/ms181765.aspx
下面是该页面的代码:
使用AdventureWorks; 去 SELECT产品编号,名称,'价格范围' = 情况下 当ListPrice = 0 THEN '制造项目-不转售' 当ListPrice < 50 THEN 'Under $50' 当ListPrice >= 50 and ListPrice < 250 THEN '低于250美元' 当ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' ELSE“超过1000美元” 结束 从生产。产品 按产品编号订购; 去
用例:
Select Case When @PaidThisMonth < @OwedPast
Then @PaidThisMonth Else @OwedPast End PaidForPast
作为内联表值UDF
CREATE FUNCTION Minimum
(@Param1 Integer, @Param2 Integer)
Returns Table As
Return(Select Case When @Param1 < @Param2
Then @Param1 Else @Param2 End MinValue)
用法:
Select MinValue as PaidforPast
From dbo.Minimum(@PaidThisMonth, @OwedPast)
附录: 当只处理两个可能的值时,这可能是最好的,如果有两个以上,考虑Craig使用values子句的回答。