programing tip

SQL에서 최소 두 값 얻기

itbloger 2020. 6. 6. 08:42
반응형

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

반응형