これは簡単なはずで、私の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にすることができます。この場合も合計を確認します。
[〜#〜] case [〜#〜] ステートメントを使用できます
SELECT Total = CASE WHEN number_of_items > 0
THEN total/number_of_items
ELSE total END
FROM xxx
Oracleを使用しているように見えるので、greatest
の代わりにmax
関数を使用できます。
select total/greatest(1,number_of_items)
from xxx;
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
_
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;
詳細については、このスレッドをチェックアウトしてください: 。NETのMath.Maxのような2つの値を取るSQL ServerのMax関数はありますか?
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を使用している可能性があり、最後の顧客が最終的にアップグレードするかどうかを見つけるのに何日も努力するため、これが必要です!
通常は次のようになります。
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による除算の例外が発生することに注意してください。そのため、他の答えでは、ユーザーがケースを入れ、他は合計でした。その例外を取得します。