SQL에서 최소 두 값 얻기
두 가지 변수가 있습니다. 하나는 PaidThisMonth
이고 다른 하나는 OwedPast
입니다. 둘 다 SQL의 일부 하위 쿼리 결과입니다. 둘 중 작은 것을 선택하여 제목이 붙은 값으로 반환하려면 어떻게해야 PaidForPast
합니까?
이 MIN
함수는 변수가 아닌 열에서 작동합니다.
사용 사례 :
Select Case When @PaidThisMonth < @OwedPast
Then @PaidThisMonth Else @OwedPast End PaidForPast
인라인 테이블 값 UDF
CREATE FUNCTION Minimum
(@Param1 Integer, @Param2 Integer)
Returns Table As
Return(Select Case When @Param1 < @Param2
Then @Param1 Else @Param2 End MinValue)
용법:
Select MinValue as PaidforPast
From dbo.Minimum(@PaidThisMonth, @OwedPast)
부록 : 이것은 가능한 두 개의 값만 처리 할 때 가장 적합 할 것입니다. 둘 이상의 값이있는 경우 값 절을 사용하여 Craig의 답 을 고려하십시오 .
SQL Server 2012 및 2014는 IIF (cont, true, false) 기능을 지원합니다. 따라서 최소한의 선택을 위해 다음과 같이 사용할 수 있습니다
SELECT IIF(first>second, second, first) the_minimal FROM table
IIF 는 글쓰기의 짧은 축약 형 이지만 작성 CASE...WHEN...ELSE
하기가 더 쉽습니다.
CASE, IIF 및 UDF를 사용하는 솔루션이 적합하지만 두 개 이상의 비교 값을 사용하여 문제를 일반적인 경우로 확장 할 때는 비실용적입니다. SQL Server 2008+의 일반화 된 솔루션은 VALUES 절의 이상한 응용 프로그램을 사용합니다.
SELECT
PaidForPast=(SELECT MIN(x) FROM (VALUES (PaidThisMonth),(OwedPast)) AS value(x))
이 웹 사이트로 인한 크레딧 : http://sqlblog.com/blogs/jamie_thomson/archive/2012/01/20/use-values-clause-to-get-the-maximum-value-from-some-columns-sql- server-t-sql.aspx
방금 업데이트 내에서 최대 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의 성능이 더 좋다고 확신합니다.
MySQL 또는 PostgreSQL의 경우 LEAST 및 GREATEST 함수를 사용하는 것이 더 좋습니다.
SELECT GREATEST(A.date0, B.date0) AS date0,
LEAST(A.date1, B.date1, B.date2) AS date1
FROM A, B
WHERE B.x = A.x
둘 다 여기에 설명되어 있습니다 : http://dev.mysql.com/doc/refman/5.0/en/comparison-operators.html
maximum (field, 0)을 계산하려는 경우 다음과 같은 트릭이 있습니다.
SELECT (ABS(field) + field)/2 FROM Table
field
음수 이면 0을 , 그렇지 않으면 0을 반환 field
합니다.
CASE 문을 사용하십시오.
이 페이지의 예제 B는 수행하려는 작업과 비슷해야합니다.
http://msdn.microsoft.com/en-us/library/ms181765.aspx
페이지의 코드는 다음과 같습니다.
USE AdventureWorks; GO SELECT ProductNumber, Name, 'Price Range' = CASE WHEN ListPrice = 0 THEN 'Mfg item - not for resale' WHEN ListPrice < 50 THEN 'Under $50' WHEN ListPrice >= 50 and ListPrice < 250 THEN 'Under $250' WHEN ListPrice >= 250 and ListPrice < 1000 THEN 'Under $1000' ELSE 'Over $1000' END FROM Production.Product ORDER BY ProductNumber ; GO
임시 테이블을 사용하여 값 범위를 삽입 한 후 스토어드 프로 시저 또는 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
이것은 최대 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
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
Although the jump from scottyc's MIN function to the MAX function should have been obvious to me, it wasn't, so I've solved for it and included it here: SELECT @a + ( ABS(@b-@a) + (@b-@a) ) / 2. The randomly generated numbers, while not proof, should at least convince skeptics that both formulae are correct.
참고URL : https://stackoverflow.com/questions/1947753/getting-the-minimum-of-two-values-in-sql
'programing tip' 카테고리의 다른 글
Maven을 통한 Java 7 코드 컴파일 (0) | 2020.06.06 |
---|---|
JavaScript에서 "$"부호의 의미는 무엇입니까 (0) | 2020.06.06 |
C #의 목록에서 항목을 제거하는 방법은 무엇입니까? (0) | 2020.06.06 |
RGB 값 대신 16 진수 색상 값을 얻는 방법은 무엇입니까? (0) | 2020.06.06 |
Excel VBA에서 정수를 문자열로 어떻게 변환합니까? (0) | 2020.06.06 |