source

Oracle SQL select에서 최대 2개의 숫자를 계산하는 방법은 무엇입니까?

manycodes 2023. 2. 25. 21:24
반응형

Oracle SQL select에서 최대 2개의 숫자를 계산하는 방법은 무엇입니까?

이것은 단순해야 하며 SQL에 대한 저의 무지를 보여줍니다.

SQL> select max(1,2) from dual;
select max(1,2) from dual
       *
ERROR at line 1:
ORA-00909: invalid number of arguments

보통 집계에 max가 사용되는 것을 알고 있습니다.여기서 무엇을 사용할 수 있나요?

결국 이런 걸 쓰고 싶어요.

select total/max(1,number_of_items) from xxx;

여기서 number_of_module은 정수이며 0을 지정할 수 있습니다.이 경우에도 합계를 보고 싶습니다.

Oracle을 사용하고 있는 것 같아서greatest대신 이것을 위해 기능하다max

select total/greatest(1,number_of_items) 
from xxx;

Oracle 10.2부터는 사용자가 원하는 기능을 수행하는 GREATE 기능이 도입되었습니다.LEST 기능도 있습니다.

예:

select greatest(1,2) from dual;

GREATEST(1,2)
-------------
            2

select greatest(8,6,4,2) from dual;

GREATEST(8,6,4,2)
-----------------
               8

select greatest(-1,-2) from dual;

GREATEST(-1,-2)
---------------
             -1

select greatest('A','B','CCC','D') from dual;

GREATEST('A','B','CCC','D')
---------------
              D

CASE 스테이트먼트를 사용할 수 있습니다.

SELECT Total = CASE WHEN number_of_items > 0 
               THEN total/number_of_items
               ELSE total END
FROM   xxx
SELECT total/(CASE WHEN number_of_items>1 THEN number_of_items ELSE 1 END) FROM xxx

여기서 작업해야 합니다.

이를 위해 새 함수를 만들어야 합니다.

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;

자세한 내용은 이 스레드를 확인하십시오.SQL Server에는 Math와 같은 두 가지 값을 취하는 Max 함수가 있나요?최대 입력.인터넷?

일반적으로 다음과 같습니다.

SELECT MAX(columnName)
FROM   Table1

또는

SELECT MAX(columnName)
FROM   (SELECT * FROM TableX) AS T1

또는 (고객의 경우 이것이 원하는 것일 수 있습니다)

SELECT MAX(value)
FROM   (SELECT 1 AS VALUE FROM DUAL UNION SELECT 2 AS VALUE FROM DUAL)

하지만 좀 더 깔끔한 방법이 있을 수도 있어요.

업데이트: 표 XXX의 number_of_items와 합계의 예를 사용하면 다음과 같습니다.

SELECT TOTAL/MAX(NUMBER_OF_ITEMS)
FROM   XXX

업데이트 2: 항목 수를 0으로 설정하면 0으로 나눗셈하는 예외가 발생한다는 점에 유의하십시오.따라서 다른 답변에서는 사용자가 케이스를 입력하고 다른 답변에서는 TOTAL을 입력했습니다.이렇게 하면 예외가 발생하지 않습니다.

이는 Oracle 8.0 이전 버전(예: 이전 버전)에서 가능합니다.CASE다음과 같은 수학적 트릭을 사용하여 도입되었습니다.

SELECT DECODE(NUMBER_OF_ITEMS-1+ABS(NUMBER_OF_ITEMS-1), 0, 1, NUMBER_OF_ITEMS) AS TOTAL
FROM   xxx

...에 상당합니다.max(1,number_of_items).

3개를 교환해 주세요.1필요에 따라 다른 값을 지정합니다.

이것은, 다음과 같은 이유로 동작합니다.number_of_items - 1number_of_module이 1보다 작을 경우 0 또는 음수가 됩니다.그리고 일반적으로는x + abs(x)x <= 0일 때는 항상 0이므로 첫 번째 값은 0입니다.decode옵션이 일치합니다.

일부 (서드파티)고객이 Oracle 8.0을 아직 사용하고 있을 수 있으며, 최종고객이 최종적으로 업그레이드 할 것인지 또는 언제 업그레이드 할 것인지를 확인하는 데 많은 시간이 걸릴 수 있기 때문에 이 기능이 필요합니다.

먼저 함수를 만듭니다.

 CREATE OR REPLACE FUNCTION max_finder(n1 in number, n2 in number)
return number
AS
    n3_max number;
BEGIN
    IF n1<=n2 THEN
        n3_max:=n2;
    ELSE 
        n3_max:=n1;
    END IF;
    return n3_max;
END;
/

그럼 실행하세요

DECLARE
    n3_max number;
BEGIN
    n3_max:=max_finder(5,13);
    dbms_output.put_line(n3_max);
END;
/

언급URL : https://stackoverflow.com/questions/3521124/how-to-calculate-the-maximum-of-two-numbers-in-oracle-sql-select

반응형