2017-02-01 7 views
0

そして、それを最も近い年に丸めます。全従業員の平均雇用期間を調べようとしています

select employee_id, months_between(start_date, sysdate) 
from job_history; 

これまでのところ、月数を計算することができました。

私はこれはあなたの平均をしたい場合、それは

SELECT AVG(DATEDIFF(year,start_date, end_date)) AS AverageLengthOfEmployment from job_history 
+0

job_historyテーブルに終了日フィールドはありますか? – user3272686

+0

はい終了日フィールドがあります –

+0

この場合、sysdateの代わりにend_dateを使用します – user3272686

答えて

1

ようになり、その後、あなたが集約必要なものである12C

+0

job_idを選択します。avg_yearsとしてavg(months_between(start_date、end_date)))を返します。 from job_history group by job_id;ありがとうございました。ほんの数回の微調整だけで動作するようになりました! –

+0

@BrandonW - 'avg_years'はどこでも12で割り切れませんか?本気ですか?そして、ゴードンが書いた 'months_between'は負の数を生み出します。私は両方の問題を修正するために彼の投稿を編集しましたが、私はあなたがそれらの修正なしで "修正する"とマークしているのを見ます。それを "正解"とする前にテストしましたか? – mathguy

+0

あなたの正しいmathguy私はまだSQLを初めて使っています。今回は正解でした。 –

0

で働いています:あなたはそれをしたい場合は

select avg(months_between(sysdate, start_date)) as avg_months 
from job_history; 

を年:

select round(avg(months_between(sysdate, start_date))/12) as avg_years 
from job_history; 
+0

DATEDIFF? Oracleに存在することに気づいていない。あなたはOPの誤ってタグ付けされた疑いがありますか? – mathguy

+0

申し訳ありません。 – user3272686

+0

私はちょうど編集を確認したと私はそれを参照してくださいそれはちょうどSQLとしてタグが付けられました。私は、私が尋ねたような質問をする前に、もっと頻繁にやるべきです - 私から "申し訳ありません"! – mathguy

0

試してみてください:

SELECT 
    employee_id 
, AVG(CAST(months_between(start_date, sysdate)/12 AS INTEGER) AS avg_work_years 
FROM job_history 
+0

"months/12"を整数としてキャストしてから平均していくのですか?それは意味をなさない。平均を取って12で割ります(または12で除算して平均します)。そして、整数としてのキャストだけです。 (OracleではROUND()関数を使用しています) – mathguy

+0

こんにちはmathguy。これはクエリの種類によって異なります。通常、誰かがどこかで働いている年数を表現したいと思っています。そしてあなたは平均を取る。保険会社は、雇用期間と被保険者の年齢をそのように、そのように計算します。しかし、ビジネスケースにもよりますが、その通りです。 ROUND()はほぼすべてのデータベースに存在しますが、浮動小数点演算であるため、はるかに遅いです。ハードCAST()はINTEGER演算であり、より速いオーダーで高速です。 ROUND()の代わりにCAST()の場合のいくつかのDB FLOOR()。その場合は、6ヶ月前に追加してください。 – marcothesane

+0

私は、(私の大きな失望に)オラクルは何も整数計算をしていないことを学んだ。 :-( – mathguy

関連する問題