다음과 같은 쿼리를 작성하고 싶습니다.
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의 답변으로
가야합니다.
” 최고의 답변 ” 이라고 말합니다 .
- UNION, PIVOT, UNPIVOT, UDF 및 미친 긴 CASE 통계로 코드를 복잡하게 할 필요는 없습니다.
- null 처리 문제로 괴롭히지 않고 null을 잘 처리합니다.
- “MAX”를 “MIN”, “AVG”또는 “SUM”으로 쉽게 바꿀 수 있습니다. 집계 함수를 사용하여 여러 열에서 집계를 찾을 수 있습니다.
- 내가 사용한 이름 (예 : “AllPrices”및 “Price”)으로 제한되지 않습니다. 다음 사람이 더 쉽게 읽고 이해할 수 있도록 자신의 이름을 선택할 수 있습니다.
- 다음 과 같이 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