2016-08-31 6 views
2

私は、スタッフ名とその給与を格納するSTAFFというテーブルを持っています。以下 は、いくつかのサンプルデータです:給与の数字を切り捨て、残りの値をランダムに分配するOracleの組み込み関数

STAFF  | SALARY 
=========================== 
ALEX   | 100.4 
JESSICA  | 100.4 
PETER  | 99.2 

合計は常に整数であり、私はすべてのスタッフの給与を切り捨てた後、ランダムにそれらのいずれかに残っている値を載せていきたいと思います。

たとえば、JESSICAが残りの値を受け取るように選択されている場合、出力は以下のようになります。

STAFF  | SALARY 
=========================== 
ALEX   | 100 
JESSICA  | 101 
PETER  | 99 

Oracleは、説明されている操作を実行するための組み込み関数を提供していますか。

+0

あなたは選択クエリまたはテーブル挿入を書くことを意図しましたか? –

+0

selectクエリはOKです。後でselect結果を別のテーブルに挿入することができます。 –

答えて

1

数量SALARY - TRUNC(SALARY)は、各給与の小数部分を各レコードに対して与える必要があります。これをテーブル全体で合計し、特定のユーザーの給与を増加させます。

UPDATE yourTable 
SET SALARY = TRUNC(SALARY) + (SELECT SUM(SALARY - TRUNC(SALARY)) FROM yourTable) 
WHERE STAFF = 'JESSICA' 
+0

あるいは、TRUNC(SALARY)+(SELECT SUM(SALARY-TRUNC(SALARY)FROM yourTable) 'は、意味的にはやや正解です(数学的にはそれほど重要ではありません)。 – zerkms

0

ここでは、生成されたランダム番号に基づいてランダムな結果を与える1つのことを試しました。

with mine(STAFF,salary,status) as 
    (
    select 'ALEX',100.4,'Y' from dual union all 
    select 'JESSICA',100.4,'Y' from dual union all 
    select 'PETER',99.2,'Y' from dual union all 
    select 'randomno',floor(dbms_random.value(1,4)),'N' vno from dual 
) 
    select STAFF,decode(rndno,rno,csalary,rsalary) salary,decode(rndno,rno,'selected to receive the remaining value',null) selected from(
    select rownum rno,STAFF,salary,round(salary) rsalary,ceil(salary) csalary, 
    (select salary from mine where status='N') rndno 
    from mine where status='Y' 
); 

ここでは、すべての実行時に新しいユーザーが選択されており、浮動給与を持っています。上記の質問で 私は乱数を供給し、結果の行と比較する1つのonther行を追加しました。

関連する問題