0

Oracleの私のテーブルはこのようなものです

Col   Col1  Col2  Col3  ColR
--   ----  ----   ----  ---- 
30    73    40    null  -10
60    32    null  20     40
90    80    null  null   10
80    45    81    30     50

上記の列でnullの代わりに0を設定することもできます。nullまたは0を無視してCol1、Col2、Col3から最小値を見つけ、Colから減算してColRにデータを入力する必要があります。

編集:テーブル内のnull値が原因で機能しないCASEステートメントを作成しました。

 SELECT col,col1,col2,col3,
  CASE
    WHEN Col1 < Col2 AND Col1  < Col3
    THEN Col - Col1
    WHEN Col2 < Col1 AND Col2  < Col3
    THEN Col - Col2
    ELSE Col - Col3
  END ColR
FROM
 (SELECT col,col1,
   CASE
    WHEN col22 IS NULL
    THEN NULL( i can also SET TO 0 but it will mess  WITH my other calculation TO find MIN)
      ELSE ROUND( 100* ( (col22) / (col44)))
    END col2 ,
    CASE
      WHEN col33 IS NULL
      THEN NULL
      ELSE ROUND( 100* ( (col33) / (col44)))
    END col3
  FROM TABLE
  )

selectクエリ内にcaseステートメントを含めました。すべての列の値はすべて、別のクエリから入力されます。

4

4 に答える 4

2

次のようなものが欲しいようです

SELECT least( (case when col1 is null or col1 = 0 then 999999999 else col1 end),
              (case when col2 is null or col2 = 0 then 999999999 else col2 end),
              (case when col3 is null or col3 = 0 then 999999999 else col3 end) )
  FROM <<table name>>

ここで、999999999 は、他の有効な値よりも常に大きい数値です。3 つの列すべての値が 0 または 0 である可能性がある場合は、その関数NULLの結果が 999999999 である場合に 0 を返すか、またはその他の意味のある値を返すかどうかを確認する追加のチェックを追加することをお勧めします。leastNULL

@X-Zero は親切にも、この構造の実用的なSQL Fiddle の例をまとめてくれました。彼の例は、3 つの列すべてにNULL値または 0 がある行を除外していることに注意してください。

于 2012-08-17T17:08:42.133 に答える
1

// COL1 または COL (任意の列) から最小値が必要な場合

SELECT MIN (COL1) FROM (SELECT * FROM TABLE WHERE COL1 IS NOT NULL)

この小さな一連の情報については、実際にはお手伝いできません。詳しく教えてください。

于 2012-08-17T16:50:02.107 に答える
1

Oracle NVL の使用法:

nvl(check_expression, replacement_value)

したがって、 nvl(col2,0) は、数学を台無しにするヌルを取得する必要があります。

だから試してください:

CASE
       WHEN nvl(col1,0) < nvl(col2,0) AND nvl(col1,0) < nvl(col3,0)
       THEN Col - nvl(col1,0)
       WHEN  nvl(col2,0) < nvl(col1,0) AND nvl(col2,0) < nvl(col3,0)
       THEN Col - nvl(col2,0)
       ELSE Col - nvl(col3,0)
END ColR 

編集:私が逃したX-Zeroのポイントを取ります。NULLS を 0 ではなく 9999999 に置き換えると、ロジックは機能すると思いますが、これはこのサンプル データに固有すぎて、実際のソリューションではない可能性があります。

于 2012-08-17T16:58:11.923 に答える
0

列のヌルを無視したい場合は、NVL 関数でラップできます。これにより、列の null 値が指定された値に置き換えられます。これには、大きな数値を使用できます。例えば:
NVL(col1,99999)

Oracle データベース SQL リファレンス - NVL: http://docs.oracle.com/cd/B19306_01/server.102/b14200/functions105.htm

于 2012-08-17T17:05:54.870 に答える