我有两个变量,一个叫PaidThisMonth,另一个叫OwedPast。它们都是SQL中一些子查询的结果。我如何选择两者中较小的一个,并将其作为一个名为PaidForPast的值返回?

MIN函数作用于列,而不是变量。


当前回答

基于mathematix和scottyc的出色逻辑/代码,我提交:

DECLARE @a INT, @b INT, @c INT = 0;

WHILE @c < 100
    BEGIN
        SET @c += 1;
        SET @a = ROUND(RAND()*100,0)-50;
        SET @b = ROUND(RAND()*100,0)-50;
        SELECT @a AS a, @b AS b,
            @a - ( ABS(@a-@b) + (@a-@b) ) / 2 AS MINab,
            @a + ( ABS(@b-@a) + (@b-@a) ) / 2 AS MAXab,
            CASE WHEN (@a <= @b AND @a = @a - ( ABS(@a-@b) + (@a-@b) ) / 2)
            OR (@a >= @b AND @a = @a + ( ABS(@b-@a) + (@b-@a) ) / 2)
            THEN 'Success' ELSE 'Failure' END AS Status;
    END;

虽然从scottyc的MIN函数到MAX函数的跳跃对我来说应该是显而易见的,但它不是,所以我已经解决了它,并将其包含在这里:SELECT @a + (ABS(@b-@a) + (@b-@a)) / 2。这些随机生成的数字虽然不是证据,但至少应该让怀疑论者相信这两个公式都是正确的。

其他回答

我遇到的情况是,我必须在一次更新中找到最多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有更好的性能。

使用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美元” 结束 从生产。产品 按产品编号订购; 去

基于mathematix和scottyc的出色逻辑/代码,我提交:

DECLARE @a INT, @b INT, @c INT = 0;

WHILE @c < 100
    BEGIN
        SET @c += 1;
        SET @a = ROUND(RAND()*100,0)-50;
        SET @b = ROUND(RAND()*100,0)-50;
        SELECT @a AS a, @b AS b,
            @a - ( ABS(@a-@b) + (@a-@b) ) / 2 AS MINab,
            @a + ( ABS(@b-@a) + (@b-@a) ) / 2 AS MAXab,
            CASE WHEN (@a <= @b AND @a = @a - ( ABS(@a-@b) + (@a-@b) ) / 2)
            OR (@a >= @b AND @a = @a + ( ABS(@b-@a) + (@b-@a) ) / 2)
            THEN 'Success' ELSE 'Failure' END AS Status;
    END;

虽然从scottyc的MIN函数到MAX函数的跳跃对我来说应该是显而易见的,但它不是,所以我已经解决了它,并将其包含在这里:SELECT @a + (ABS(@b-@a) + (@b-@a)) / 2。这些随机生成的数字虽然不是证据,但至少应该让怀疑论者相信这两个公式都是正确的。

这最多适用于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;

使用临时表插入值范围,然后从存储过程或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