web-dev-qa-db-ja.com

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_itemsは整数であり、0にすることができます。この場合も合計を確認します。

26
Peter G.

[〜#〜] case [〜#〜] ステートメントを使用できます

SELECT Total = CASE WHEN number_of_items > 0 
               THEN total/number_of_items
               ELSE total END
FROM   xxx
14

Oracleを使用しているように見えるので、greatestの代わりにmax関数を使用できます。

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

Oracle 10.2の時点で、彼らはあなたが望むことをするGREATEST関数を導入しました。 LEAST関数もあります。

例:

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
_
27
Rod Meyer
SELECT total/(CASE WHEN number_of_items>1 THEN number_of_items ELSE 1 END) FROM xxx

ここで動作するはずです......

3
Hari Menon

このための新しい関数を作成する必要があります。

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;

詳細については、このスレッドをチェックアウトしてください: 。NETのMath.Maxのような2つの値を取るSQL ServerのMax関数はありますか?

2
Uri Abramson

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_ sを別の値に置き換えます。

これは、number_of_itemsが1未満のときに_number_of_items - 1_がゼロまたは負になるので機能します。一般に、x <= 0の場合、x + abs(x)は常にゼロなので、最初のdecodeオプションは一致しました。

一部の(サードパーティの)顧客がまだOracle 8.0を使用している可能性があり、最後の顧客が最終的にアップグレードするかどうかを見つけるのに何日も努力するため、これが必要です!

1
wardies

通常は次のようになります。

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による除算の例外が発生することに注意してください。そのため、他の答えでは、ユーザーがケースを入れ、他は合計でした。その例外を取得します。

1
XstreamINsanity