[sql] SQL Server에 .NET의 Math.Max와 같은 두 가지 값을 취하는 Max 함수가 있습니까?

다음과 같은 쿼리를 작성하고 싶습니다.

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

그러나 이것은 MAX기능이 작동 하는 방식이 아닙니다 . 집계 함수이므로 단일 매개 변수를 예상 한 다음 모든 행의 MAX를 리턴합니다.

누구든지 내 방식대로하는 법을 알고 있습니까?



답변

User-Defined Function예제와 비슷한 구문을 원한다면 if 를 작성해야 하지만 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


답변

SQL Server 2008 이상을 사용하는 경우 이것이 더 나은 솔루션입니다.

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

모든 크레딧과 투표는 관련 질문 인 “여러 열의 SQL MAX?”에 대한 Sven의 답변으로
가야합니다.
최고의 답변 ” 이라고 말합니다 .

  1. UNION, PIVOT, UNPIVOT, UDF 및 미친 긴 CASE 통계로 코드를 복잡하게 할 필요는 없습니다.
  2. null 처리 문제로 괴롭히지 않고 null을 잘 처리합니다.
  3. “MAX”를 “MIN”, “AVG”또는 “SUM”으로 쉽게 바꿀 수 있습니다. 집계 함수를 사용하여 여러 열에서 집계를 찾을 수 있습니다.
  4. 내가 사용한 이름 (예 : “AllPrices”및 “Price”)으로 제한되지 않습니다. 다음 사람이 더 쉽게 읽고 이해할 수 있도록 자신의 이름을 선택할 수 있습니다.
  5. 다음 과 같이 SQL Server 2008의 파생 _
    테이블을 사용하여 여러 집계를 찾을 수 있습니다 . SELECT MAX (a), MAX (b) FROM (VALUES (1, 2), (3, 4), (5, 6), (7, 8), (9, 10)) AS MyTable (a, b)

답변

한 줄로 할 수 있습니다 :

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

편집 : 매우 큰 숫자를 다루는 경우 정수 오버플로를 피하기 위해 값 변수를 bigint로 변환해야합니다.


답변

나는 그렇게 생각하지 않습니다. 나는 다른 날 이것을 원했습니다. 내가 얻은 가장 가까운 것은 :

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


답변

IIF 기능을 사용 하지 않는 이유 (SQL Server 2012 이상 필요)

IIF(a>b, a, b)

그게 다야.

(힌트 : 둘 중 하나가 null 일 때마다 null결과 a>b가 false이므로주의하십시오. b이 경우 결과가됩니다)


답변

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


답변

다른 답변은 좋지만 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