[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.당신은 당신의 예와 유사한 구문을하고 싶었 경우 사용자 정의 함수를 만들 필요가 싶지만, 다른 사람이 말했듯이 당신은 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.(위 또는) 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.한 줄에서 수행 할 수 있습니다 :
한 줄에서 수행 할 수 있습니다 :
-- the following expression calculates ==> max(@val1, @val2) SELECT 0.5 * ((@val1 + @val2) + ABS(@val1 - @val2))
편집 : 당신은 매우 많은 수를 처리하는 경우는 정수 오버 플로우를 방지하기 위해 BIGINT로 값 변수를 변환해야합니다.
-
==============================
4.그렇게 생각하지 않아요. 나는 다른 일이 원했다. 내가 가진 가장 가까운했다 :
그렇게 생각하지 않아요. 나는 다른 일이 원했다. 내가 가진 가장 가까운했다 :
SELECT o.OrderId, CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice ELSE o.SuggestedPrice END FROM Order o
-
==============================
5.왜 IIF 기능을하지 (나중에 SQL 서버 2012 필요)
왜 IIF 기능을하지 (나중에 SQL 서버 2012 필요)
IIF(a>b, a, b)
이게 다예요.
(힌트 : 하나가 널 (null)이 될 것입니다에 대한 중 하나가 null 때마다 결과 이후> B는 거짓이 될 것입니다, 조심 그래서 B는이 경우에 결과가 될 것입니다.)
-
==============================
6.
DECLARE @MAX INT @MAX = (SELECT MAX(VALUE) FROM (SELECT 1 AS VALUE UNION SELECT 2 AS VALUE) AS T1)
-
==============================
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.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.당신이 컬럼을 통해 같은 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.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.나는 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.이 같은 그것의 간단 :
이 같은 그것의 간단 :
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.아차, 난 그냥이 질문에 속는 사람을 게시 ...
아차, 난 그냥이 질문에 속는 사람을 게시 ...
대답은, 더 오라클의 가장 큰 같은 기능 거기에 내장되어 있습니다,하지만 당신은 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.여기에 널 (null)을 처리해야하며, MSSQL의 이전 버전에서 작동하는 경우의 예입니다. 이것은 인기있는 사례 중 하나 일에서 인라인 기능을 기반으로합니다 :
여기에 널 (null)을 처리해야하며, MSSQL의 이전 버전에서 작동하는 경우의 예입니다. 이것은 인기있는 사례 중 하나 일에서 인라인 기능을 기반으로합니다 :
case when a >= b then a else isnull(b,a) end
-
==============================
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.그것은 이미 언급 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.많은 수에 대한 위의 답변을 들어, 추가 / 빼기 전에 곱셈을 할 수 있습니다. 그것은 약간의 부피이다하지만 캐스트가 필요하지 않습니다. (나는 속도를 말할 수 있지만 나는 그것이 꽤 빠른 아직 가정)
많은 수에 대한 위의 답변을 들어, 추가 / 빼기 전에 곱셈을 할 수 있습니다. 그것은 약간의 부피이다하지만 캐스트가 필요하지 않습니다. (나는 속도를 말할 수 있지만 나는 그것이 꽤 빠른 아직 가정)
변경
적어도 대안에 당신은 캐스팅을 피하려면.
-
==============================
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.당신이 뭔가를 할 수 있습니다 :
당신이 뭔가를 할 수 있습니다 :
select case when o.NegotiatedPrice > o.SuggestedPrice then o.NegotiatedPrice else o.SuggestedPrice end
-
==============================
20.
SELECT o.OrderID CASE WHEN o.NegotiatedPrice > o.SuggestedPrice THEN o.NegotiatedPrice ELSE o.SuggestedPrice END AS Price
-
==============================
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.가장 간단한 형태에서 ...
가장 간단한 형태에서 ...
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.SQL 서버 2012 :
SQL 서버 2012 :
SELECT o.OrderId, IIF( o.NegotiatedPrice >= o.SuggestedPrice, o.NegotiatedPrice, ISNULL(o.SuggestedPrice, o.NegiatedPrice) ) FROM Order o
-
==============================
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.
select OrderId, ( select max([Price]) from ( select NegotiatedPrice [Price] union all select SuggestedPrice ) p ) from [Order]
-
==============================
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.신화의 대답에 확장 및 비교 값 유형이 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.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.프레스토에서는 사용을 사용할 수 있습니다
프레스토에서는 사용을 사용할 수 있습니다
SELECT array_max(ARRAY[o.NegotiatedPrice, o.SuggestedPrice])
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
'SQL' 카테고리의 다른 글
[SQL] 어떻게 MySQL을 순차적 번호 격차를 찾는 방법은? (0) | 2020.03.20 |
---|---|
[SQL] SQL에서, 계수의 차이 (열) 무엇과 COUNT (*)? (0) | 2020.03.20 |
[SQL] 무엇 TRUNCATE의 차이점은 그리고 SQL에서 DELETE (0) | 2020.03.20 |
[SQL] SQL 서버 : 어떻게 첫 번째 행에 가입하세요 (0) | 2020.03.20 |
[SQL] DoCmd.SetWarnings와 CurrentDB.Execute의 차이점은 무엇입니까 (0) | 2020.03.20 |