我有两个变量,一个叫PaidThisMonth,另一个叫OwedPast。它们都是SQL中一些子查询的结果。我如何选择两者中较小的一个,并将其作为一个名为PaidForPast的值返回?
MIN函数作用于列,而不是变量。
我有两个变量,一个叫PaidThisMonth,另一个叫OwedPast。它们都是SQL中一些子查询的结果。我如何选择两者中较小的一个,并将其作为一个名为PaidForPast的值返回?
MIN函数作用于列,而不是变量。
当前回答
这最多适用于5个日期并处理空值。只是不能让它作为内联函数工作。
CREATE FUNCTION dbo.MinDate(@Date1 datetime = Null,
@Date2 datetime = Null,
@Date3 datetime = Null,
@Date4 datetime = Null,
@Date5 datetime = Null)
RETURNS Datetime AS
BEGIN
--USAGE select dbo.MinDate('20120405',null,null,'20110305',null)
DECLARE @Output datetime;
WITH Datelist_CTE(DT)
AS (
SELECT @Date1 AS DT WHERE @Date1 is not NULL UNION
SELECT @Date2 AS DT WHERE @Date2 is not NULL UNION
SELECT @Date3 AS DT WHERE @Date3 is not NULL UNION
SELECT @Date4 AS DT WHERE @Date4 is not NULL UNION
SELECT @Date5 AS DT WHERE @Date5 is not NULL
)
Select @Output=Min(DT) FROM Datelist_CTE;
RETURN @Output;
END;
其他回答
这里有一个技巧,如果你想计算最大值(字段,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
用例:
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子句的回答。
使用CASE、IIF和UDF的解决方案是足够的,但是当将问题扩展到使用超过2个比较值的一般情况时是不切实际的。广义 SQL Server 2008+中的解决方案利用VALUES子句的一个奇怪应用:
SELECT
PaidForPast=(SELECT MIN(x) FROM (VALUES (PaidThisMonth),(OwedPast)) AS value(x))
由于本网站: http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql-server-t-sql.aspx
SELECT (WHEN first > second THEN second ELSE first END) the_minimal FROM table