복붙노트

[SQL] .NET에서 Math.Max ​​같은 두 값을 사용합니다 SQL Server의 최대 기능이 있습니까?

SQL

.NET에서 Math.Max ​​같은 두 값을 사용합니다 SQL Server의 최대 기능이 있습니까?

나는이 같은 쿼리를 작성합니다 :

SELECT o.OrderId, MAX(o.NegotiatedPrice, o.SuggestedPrice)
FROM Order o

하지만이 방법 MAX 기능 작동, 옳지 않아? 그것은 하나의 매개 변수를 기대하고 모든 행의 MAX를 반환 그래서 집계 함수입니다.

누군가는 그것을 내 방식을 수행하는 방법을 알고 있나요?

해결법

  1. ==============================

    1.당신은 당신의 예와 유사한 구문을하고 싶었 경우 사용자 정의 함수를 만들 필요가 싶지만, 다른 사람이 말했듯이 당신은 CASE 문으로 비교적 쉽게, 인라인, 당신이 원하는 것을 할 수 있습니다.

    당신은 당신의 예와 유사한 구문을하고 싶었 경우 사용자 정의 함수를 만들 필요가 싶지만, 다른 사람이 말했듯이 당신은 CASE 문으로 비교적 쉽게, 인라인, 당신이 원하는 것을 할 수 있습니다.

    UDF는 다음과 같이 될 수있다 :

    create function dbo.InlineMax(@val1 int, @val2 int)
    returns int
    as
    begin
      if @val1 > @val2
        return @val1
      return isnull(@val2,@val1)
    end
    

    ... 그리고 그렇게처럼 부를 것이다 ...

    SELECT o.OrderId, dbo.InlineMax(o.NegotiatedPrice, o.SuggestedPrice) 
    FROM Order o
    
  2. ==============================

    2.(위 또는) SQL 서버 2008을 사용하는 경우, 다음이 더 나은 솔루션입니다 :

    (위 또는) SQL 서버 2008을 사용하는 경우, 다음이 더 나은 솔루션입니다 :

    SELECT o.OrderId,
           (SELECT MAX(Price)
            FROM (VALUES (o.NegotiatedPrice),(o.SuggestedPrice)) AS AllPrices(Price))
    FROM Order o
    

    모든 신용 및 투표 관련 질문에 스벤의 대답에 가야한다 "여러 열의 SQL MAX?" 나는 그것이 "가장 좋은 대답"때문에 말 :

  3. ==============================

    3.한 줄에서 수행 할 수 있습니다 :

    한 줄에서 수행 할 수 있습니다 :

    -- the following expression calculates ==> max(@val1, @val2)
    SELECT 0.5 * ((@val1 + @val2) + ABS(@val1 - @val2)) 
    

    편집 : 당신은 매우 많은 수를 처리하는 경우는 정수 오버 플로우를 방지하기 위해 BIGINT로 값 변수를 변환해야합니다.

  4. ==============================

    4.그렇게 생각하지 않아요. 나는 다른 일이 원했다. 내가 가진 가장 가까운했다 :

    그렇게 생각하지 않아요. 나는 다른 일이 원했다. 내가 가진 가장 가까운했다 :

    SELECT
      o.OrderId,
      CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice 
         ELSE o.SuggestedPrice
      END
    FROM Order o
    
  5. ==============================

    5.왜 IIF 기능을하지 (나중에 SQL 서버 2012 필요)

    왜 IIF 기능을하지 (나중에 SQL 서버 2012 필요)

    IIF(a>b, a, b)
    

    이게 다예요.

    (힌트 : 하나가 널 (null)이 될 것입니다에 대한 중 하나가 null 때마다 결과 이후> B는 거짓이 될 것입니다, 조심 그래서 B는이 경우에 결과가 될 것입니다.)

  6. ==============================

    6.

    DECLARE @MAX INT
    @MAX = (SELECT MAX(VALUE) 
                   FROM (SELECT 1 AS VALUE UNION 
                         SELECT 2 AS VALUE) AS T1)
    
  7. ==============================

    7.다른 대답은 좋다, 그러나 당신이 NULL 값을 갖는에 대해 걱정할 필요가있는 경우, 당신은이 변형을 할 수 있습니다 :

    다른 대답은 좋다, 그러나 당신이 NULL 값을 갖는에 대해 걱정할 필요가있는 경우, 당신은이 변형을 할 수 있습니다 :

    SELECT o.OrderId, 
       CASE WHEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice) > ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
            THEN ISNULL(o.NegotiatedPrice, o.SuggestedPrice)
            ELSE ISNULL(o.SuggestedPrice, o.NegotiatedPrice)
       END
    FROM Order o
    
  8. ==============================

    8.SQL 서버 2012 이상에서는이 개 값의 최대 값을 얻기 위해 IIF와 ISNULL (또는 COALESCE)의 조합을 사용할 수 있습니다. 그 중 하나가 NULL 경우에도.

    SQL 서버 2012 이상에서는이 개 값의 최대 값을 얻기 위해 IIF와 ISNULL (또는 COALESCE)의 조합을 사용할 수 있습니다. 그 중 하나가 NULL 경우에도.

    IIF(col1 >= col2, col1, ISNULL(col2, col1)) 
    

    모두 NULL 때 또는 당신이 원하는 경우는 0을 반환

    IIF(col1 >= col2, col1, COALESCE(col2, col1, 0)) 
    

    예 니펫을 :

    -- use table variable for testing purposes
    declare @Order table 
    (
      OrderId int primary key identity(1,1),
      NegotiatedPrice decimal(10,2),
      SuggestedPrice decimal(10,2)
    );
    
    -- Sample data
    insert into @Order (NegotiatedPrice, SuggestedPrice) values
    (0, 1),
    (2, 1),
    (3, null),
    (null, 4);
    
    -- Query
    SELECT 
         o.OrderId, o.NegotiatedPrice, o.SuggestedPrice, 
         IIF(o.NegotiatedPrice >= o.SuggestedPrice, o.NegotiatedPrice, ISNULL(o.SuggestedPrice, o.NegotiatedPrice)) AS MaxPrice
    FROM @Order o
    

    결과:

    OrderId NegotiatedPrice SuggestedPrice  MaxPrice
    1       0,00            1,00            1,00
    2       2,00            1,00            2,00
    3       3,00            NULL            3,00
    4       NULL            4,00            4,00
    

    그러나 SUM 여러 값을 하나 개의 필요가 있다면? CROSS는 값의 집계에 적용 할 그럼 내가 제안한다. 이것은 또한이 같은 시간에 다른 일을 계산할 수있는 이점이있다.

    예:

    SELECT t.*
    , ca.[Total]
    , ca.[Maximum]
    , ca.[Minimum]
    , ca.[Average]
    FROM SomeTable t
    CROSS APPLY (
       SELECT 
        SUM(v.col) AS [Total], 
        MIN(v.col) AS [Minimum], 
        MAX(v.col) AS [Maximum], 
        AVG(v.col) AS [Average]
       FROM (VALUES (t.Col1), (t.Col2), (t.Col3), (t.Col4)) v(col)
    ) ca
    
  9. ==============================

    9.당신이 컬럼을 통해 같은 MAX 같은 집계를 사용하는이 방법을 사용할 수 있도록 하위 쿼리는 외부 쿼리에서 열을 액세스 할 수 있습니다. (아마 불구하고 관련 컬럼의 큰 번호보다 유용있을 때)

    당신이 컬럼을 통해 같은 MAX 같은 집계를 사용하는이 방법을 사용할 수 있도록 하위 쿼리는 외부 쿼리에서 열을 액세스 할 수 있습니다. (아마 불구하고 관련 컬럼의 큰 번호보다 유용있을 때)

    ;WITH [Order] AS
    (
    SELECT 1 AS OrderId, 100 AS NegotiatedPrice, 110 AS SuggestedPrice UNION ALL
    SELECT 2 AS OrderId, 1000 AS NegotiatedPrice, 50 AS SuggestedPrice
    )
    SELECT
           o.OrderId, 
           (SELECT MAX(price)FROM 
               (SELECT o.NegotiatedPrice AS price 
                UNION ALL SELECT o.SuggestedPrice) d) 
            AS MaxPrice 
    FROM  [Order]  o
    
  10. ==============================

    10.SQL 서버 2012 IIF 소개 :

    SQL 서버 2012 IIF 소개 :

    SELECT 
        o.OrderId, 
        IIF( ISNULL( o.NegotiatedPrice, 0 ) > ISNULL( o.SuggestedPrice, 0 ),
             o.NegotiatedPrice, 
             o.SuggestedPrice 
        )
    FROM 
        Order o
    

    당신 된 Boolean_expression의 양쪽에 NULL이 (NULL 반대) IIF는 false_value를 반환 할 수 있기 때문에, IIF를 사용하는 경우 권장 널 (NULL)입니다 취급.

  11. ==============================

    11.나는 kcrumley가 제공하는 솔루션으로 갈 것 그냥 널 (null)을 처리하기 위해 약간 수정

    나는 kcrumley가 제공하는 솔루션으로 갈 것 그냥 널 (null)을 처리하기 위해 약간 수정

    create function dbo.HigherArgumentOrNull(@val1 int, @val2 int)
    returns int
    as
    begin
      if @val1 >= @val2
        return @val1
      if @val1 < @val2
        return @val2
    
     return NULL
    end
    

    편집하다 마크에서 코멘트 후 수정. 그가 제대로 3 평가 로직 X> NULL에 지적 또는 X

  12. ==============================

    12.이 같은 그것의 간단 :

    이 같은 그것의 간단 :

    CREATE FUNCTION InlineMax
    (
        @p1 sql_variant,
        @p2 sql_variant
    )  RETURNS sql_variant
    AS
    BEGIN
        RETURN CASE 
            WHEN @p1 IS NULL AND @p2 IS NOT NULL THEN @p2 
            WHEN @p2 IS NULL AND @p1 IS NOT NULL THEN @p1
            WHEN @p1 > @p2 THEN @p1
            ELSE @p2 END
    END;
    
  13. ==============================

    13.아차, 난 그냥이 질문에 속는 사람을 게시 ...

    아차, 난 그냥이 질문에 속는 사람을 게시 ...

    대답은, 더 오라클의 가장 큰 같은 기능 거기에 내장되어 있습니다,하지만 당신은 UDF, 메모와 함께 2 열에 대한 유사한 결과를 얻을 수 있습니다, SQL_VARIANT의 사용은 여기에 매우 중요합니다.

    create table #t (a int, b int) 
    
    insert #t
    select 1,2 union all 
    select 3,4 union all
    select 5,2
    
    -- option 1 - A case statement
    select case when a > b then a else b end
    from #t
    
    -- option 2 - A union statement 
    select a from #t where a >= b 
    union all 
    select b from #t where b > a 
    
    -- option 3 - A udf
    create function dbo.GREATEST
    ( 
        @a as sql_variant,
        @b as sql_variant
    )
    returns sql_variant
    begin   
        declare @max sql_variant 
        if @a is null or @b is null return null
        if @b > @a return @b  
        return @a 
    end
    
    
    select dbo.GREATEST(a,b)
    from #t
    

    크리스토프

    이 답변을 게시 됨 :

    create table #t (id int IDENTITY(1,1), a int, b int)
    insert #t
    select 1,2 union all
    select 3,4 union all
    select 5,2
    
    select id, max(val)
    from #t
        unpivot (val for col in (a, b)) as unpvt
    group by id
    
  14. ==============================

    14.여기에 널 (null)을 처리해야하며, MSSQL의 이전 버전에서 작동하는 경우의 예입니다. 이것은 인기있는 사례 중 하나 일에서 인라인 기능을 기반으로합니다 :

    여기에 널 (null)을 처리해야하며, MSSQL의 이전 버전에서 작동하는 경우의 예입니다. 이것은 인기있는 사례 중 하나 일에서 인라인 기능을 기반으로합니다 :

    case
      when a >= b then a
      else isnull(b,a)
    end
    
  15. ==============================

    15.

    SELECT o.OrderId,   
    --MAX(o.NegotiatedPrice, o.SuggestedPrice)  
    (SELECT MAX(v) FROM (VALUES (o.NegotiatedPrice), (o.SuggestedPrice)) AS value(v)) as ChoosenPrice  
    FROM Order o
    
  16. ==============================

    16.그것은 이미 언급 CASE 구조보다 효율적으로 나는 아마, 이런 식으로하지 않을 것이다 - 아마도 당신은 두 쿼리에 대한 인덱스를 커버했다,하지 않는 한. 어느 쪽이든, 그것은 유사한 문제에 대한 유용한 기술이다 :

    그것은 이미 언급 CASE 구조보다 효율적으로 나는 아마, 이런 식으로하지 않을 것이다 - 아마도 당신은 두 쿼리에 대한 인덱스를 커버했다,하지 않는 한. 어느 쪽이든, 그것은 유사한 문제에 대한 유용한 기술이다 :

    SELECT OrderId, MAX(Price) as Price FROM (
       SELECT o.OrderId, o.NegotiatedPrice as Price FROM Order o
       UNION ALL
       SELECT o.OrderId, o.SuggestedPrice as Price FROM Order o
    ) as A
    GROUP BY OrderId
    
  17. ==============================

    17.많은 수에 대한 위의 답변을 들어, 추가 / 빼기 전에 곱셈을 할 수 있습니다. 그것은 약간의 부피이다하지만 캐스트가 필요하지 않습니다. (나는 속도를 말할 수 있지만 나는 그것이 꽤 빠른 아직 가정)

    많은 수에 대한 위의 답변을 들어, 추가 / 빼기 전에 곱셈을 할 수 있습니다. 그것은 약간의 부피이다하지만 캐스트가 필요하지 않습니다. (나는 속도를 말할 수 있지만 나는 그것이 꽤 빠른 아직 가정)

    변경

    적어도 대안에 당신은 캐스팅을 피하려면.

  18. ==============================

    18.여기에 (신화의 답변에 따라) NULL 처리를 가진 IIF 버전은 다음과 같습니다

    여기에 (신화의 답변에 따라) NULL 처리를 가진 IIF 버전은 다음과 같습니다

    IIF(a IS NULL OR b IS NULL, ISNULL(a,b), IIF(a > b, a, b))
    

    논리는 다음 값 중 하나가 NULL 인 경우, (양자 모두가 NULL 인 경우, 널 (NULL)이 리턴) NULL 아닌 하나를 반환한다. 그렇지 않으면 더 큰 하나를 반환합니다.

    동일은 MIN에 대해 수행 할 수 있습니다.

    IIF(a IS NULL OR b IS NULL, ISNULL(a,b), IIF(a < b, a, b))
    
  19. ==============================

    19.당신이 뭔가를 할 수 있습니다 :

    당신이 뭔가를 할 수 있습니다 :

    select case when o.NegotiatedPrice > o.SuggestedPrice 
    then o.NegotiatedPrice
    else o.SuggestedPrice
    end
    
  20. ==============================

    20.

    SELECT o.OrderID
    CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN
     o.NegotiatedPrice
    ELSE
     o.SuggestedPrice
    END AS Price
    
  21. ==============================

    21.

    CREATE FUNCTION [dbo].[fnMax] (@p1 INT, @p2 INT)
    RETURNS INT
    AS BEGIN
    
        DECLARE @Result INT
    
        SET @p2 = COALESCE(@p2, @p1)
    
        SELECT
            @Result = (
                       SELECT
                        CASE WHEN @p1 > @p2 THEN @p1
                             ELSE @p2
                        END
                      )
    
        RETURN @Result
    
    END
    
  22. ==============================

    22.가장 간단한 형태에서 ...

    가장 간단한 형태에서 ...

    CREATE FUNCTION fnGreatestInt (@Int1 int, @Int2 int )
    RETURNS int
    AS
    BEGIN
    
        IF @Int1 >= ISNULL(@Int2,@Int1)
            RETURN @Int1
        ELSE
            RETURN @Int2
    
        RETURN NULL --Never Hit
    
    END
    
  23. ==============================

    23.SQL 서버 2012 :

    SQL 서버 2012 :

    SELECT 
        o.OrderId, 
        IIF( o.NegotiatedPrice >= o.SuggestedPrice,
             o.NegotiatedPrice, 
             ISNULL(o.SuggestedPrice, o.NegiatedPrice) 
        )
    FROM 
        Order o
    
  24. ==============================

    24.여기에 간단한 NULL 처리와 @Scott 랭함의 대답은 :

    여기에 간단한 NULL 처리와 @Scott 랭함의 대답은 :

    SELECT
          o.OrderId,
          CASE WHEN (o.NegotiatedPrice > o.SuggestedPrice OR o.SuggestedPrice IS NULL) 
             THEN o.NegotiatedPrice 
             ELSE o.SuggestedPrice
          END As MaxPrice
    FROM Order o
    
  25. ==============================

    25.

    select OrderId, (
        select max([Price]) from (
            select NegotiatedPrice [Price]
            union all
            select SuggestedPrice
        ) p
    ) from [Order]
    
  26. ==============================

    26.

     -- Simple way without "functions" or "IF" or "CASE"
     -- Query to select maximum value
     SELECT o.OrderId
      ,(SELECT MAX(v)
       FROM (VALUES (o.NegotiatedPrice), (o.SuggestedPrice)) AS value(v)) AS MaxValue
      FROM Order o;
    
  27. ==============================

    27.신화의 대답에 확장 및 비교 값 유형이 INT 가정하고,이 방법도 작동합니다 :

    신화의 대답에 확장 및 비교 값 유형이 INT 가정하고,이 방법도 작동합니다 :

    SELECT IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
    

    이 예제 값과 전체 테스트입니다 :

    DECLARE @A AS INT
    DECLARE @B AS INT
    
    SELECT  @A = 2, @B = 1
    SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
    -- 2
    
    SELECT  @A = 2, @B = 3
    SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
    -- 3
    
    SELECT  @A = 2, @B = NULL
    SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
    -- 2    
    
    SELECT  @A = NULL, @B = 1
    SELECT  IIF(ISNULL(@A, -2147483648) > ISNULL(@B, -2147483648), @A, @B)
    -- 1
    
  28. ==============================

    28.MemSQL에서 다음을 수행 :

    MemSQL에서 다음을 수행 :

    -- DROP FUNCTION IF EXISTS InlineMax;
    DELIMITER //
    CREATE FUNCTION InlineMax(val1 INT, val2 INT) RETURNS INT AS
    DECLARE
      val3 INT = 0;
    BEGIN
     IF val1 > val2 THEN
       RETURN val1;
     ELSE
       RETURN val2;
     END IF; 
    END //
    DELIMITER ;
    
    SELECT InlineMax(1,2) as test;
    
  29. ==============================

    29.프레스토에서는 사용을 사용할 수 있습니다

    프레스토에서는 사용을 사용할 수 있습니다

    SELECT array_max(ARRAY[o.NegotiatedPrice, o.SuggestedPrice])
    
  30. from https://stackoverflow.com/questions/124417/is-there-a-max-function-in-sql-server-that-takes-two-values-like-math-max-in-ne by cc-by-sa and MIT license