• ベストアンサー

時給の変更に対応する方法

access2000を使って従業員の人件費を計算しようと思っています。 時給テーブルで従業員番号、従業員名、時給 日時テーブルで日付、労働時間、従業員番号 これで人件費が計算しようと思ったのですが、よく考えたら時給は変更になることがあります。 時給テーブルの時給を変更してしまうと過去の人件費まで変わってしまうので、このままではダメなことが分かりました。 かといって毎日各従業員ごとに時給を入力するのは間違えのもとになると思うので避けたいと思っています。 時給の変更に対応できるようにするにはどのようにしたらいいのでしょうか。 ご存知の方、よろしくお願いします。

  • shinp
  • お礼率33% (54/163)

質問者が選んだベストアンサー

  • ベストアンサー
  • agricap
  • ベストアンサー率40% (79/195)
回答No.9

SELECT SUM(A.労働時間*B.時給) FROM 日時テーブル AS A, 時給テーブル AS B WHERE A.従業員番号=1 AND B.従業員番号=1   AND B.開始日<=A.日付 AND A.日付<=B.終了日   AND '2006/01/01'<=A.日付 AND A.日付<='2006/03/31' >この場合、ある特定の日の人件費は大丈夫だと思うのですが、何日~何日の人件費を求めようとした時に、もしその期間内で時給が変わっていても問題ないでしょうか。 そもそもこの場合の日付を指定した人件費はどのように求めたらいいのでしょうか。 問題ないと思いますが、何が心配ですか? たとえば、従業員1の2006/1/1~2006/03/31までの給料は、以下 のようなSQLで求められます。 (日付の書き方はシステムによって変わりますので、一例です) SELECT SUM(A.労働時間*B.時給) FROM 日時テーブル AS A, 時給テーブル AS B WHERE A.従業員番号=1 AND B.従業員番号=1   AND B.開始日<=A.日付 AND A.日付<=B.終了日   AND TO_DATE('2006/01/01')<=A.日付 AND A.日付<=TO_DATE('2006/03/31') こういうことをしたい場合、性能は日時テーブルに時給をもった方 が安全ですが、多分この程度のSQLなら、性能も大抵は問題ありません。 日時デーブルの従業員番号、日付、時給テーブルの従業員番号ぐらいにインデッ クスをつけておけば万全でしょう。 従業員が数万人ぐらいいても、1秒以内に終わるレベルだと思います。

shinp
質問者

お礼

ようやくできました。ありがとうございました。

その他の回答 (8)

  • agricap
  • ベストアンサー率40% (79/195)
回答No.8

#7です。念のため、補足しておきます。 時給テーブルには、1従業員につき、複数の時給の情報を持たせる ことができます。たとえば、従業員1の2006/1/1~2006/1/31 は800円、2006/2/1~2006/3/31は900円であったとすると、 従業員番号、  開始日、  終了日、時給     1、2006/01/01、2006/01/31、 800     1、2006/02/01、2006/03/31、 900 のような感じになります。

shinp
質問者

補足

この場合、ある特定の日の人件費は大丈夫だと思うのですが、何日~何日の人件費を求めようとした時に、もしその期間内で時給が変わっていても問題ないでしょうか。 そもそもこの場合の日付を指定した人件費はどのように求めたらいいのでしょうか。 分かりにくい日本語ですみません。

  • agricap
  • ベストアンサー率40% (79/195)
回答No.7

#3です。 以下のような感じです。時給テーブルを2つに分けます。 時給テーブル(従業員番号、開始日、終了日、時給) 従業員名テーブル(従業員番号、従業員名) 少し専門的にいうと、 開始日と終了日を加えたとき、 時給テーブル(従業員番号、従業員名、開始日、終了日、時給) というふうに1つにしてしまうと、 第2正規形でなくなって、よろしくありません。 具体的には、同じ従業員番号に対して従業員名を複数レコード に入力するため、間違いやすいですし、従業員名が誤っている ことに気づいた場合、複数レコードを修正しなければならない ので、間違いやすい、といえます。

noname#22222
noname#22222
回答No.6

s_husky です。 「マルチ時給の場合はテーブル構造の再検討が必要では?」と感じましたので再投稿します。 私なら、従業員に複数の時給を設定する場合、次のようなテーブル構造にします。 従業員テーブル:ID,従業員番号,従業員名,現行時給ID 時給テーブル:ID,時給額,登録日(又は、適用開始日、適用終了日) さて、この場合、<日時テーブル>には、最終的には<時給テーブル.ID>でリンクすることになります。 <従業員テーブル.現行時給ID>は可変だからです。 なお、この設計は、<時給が不可逆的に増加する>という前提が崩れると予測しています。 <開始日><終了日>でなく<登録日>としている理由です。 ※列<時給テーブル.適用従業員ID>が、必要か否かも検討すべきかと思います。 ※5つ程度の時給を30人に適用している場合、5レコードで管理するのか150レコードを準備するのかは検討に値します。

  • O_cyan
  • ベストアンサー率59% (745/1260)
回答No.5

>時給テーブルの時給を変更してしまうと過去の人件費まで変わってしまうので、このままではダメなことが分かりました。 >時給の変更に対応できるようにするにはどのようにしたらいいのでしょうか。 リレーションで1対多で時給テーブルと日時テーブルを結合していると思いますが参照整合性をとっていてもフィールドの連鎖更新のチェックを外せば時給の金額が変更になっても時給テーブルの過去の時給の金額は変更した金額に更新されません。 単純にリレーションシップのフィールドの連鎖更新のチェックを外すだけで済みます。

noname#182251
noname#182251
回答No.4

給与は何回も計算し直したり、過去に遡って計算するような性格のデータではないと考えます。 従って計算した結果は ・06年06月給与 ・06年06月25日給与 など最低 ・日付型 ・金銭型 ・個人ID フィールドを持ったテーブルに記録すれば良いでしょう。乱暴ないい方をすれば、こうすることにより「時給」データは最新のものが一つだけでも良い。しかしこれは極端だと思うので#3案が妥当でしょう。

  • agricap
  • ベストアンサー率40% (79/195)
回答No.3

ANo.1 の案に類似ですが、時給テーブルを、 開始日、終了日 を加えることをおすすめします。 開始日と終了日を両方もった方が、処理がシンプルになり、また高速に処理できると思います。 「毎日各従業員ごとに時給を入力するのは間違いのもとになると思うので避けたい」 ということですが、一理あります。新規に入力するときも間違いやすくなりますし、たとえば、一度入力してある日付の時給がまちがっていたことに後で気づいた場合、複数日分の時給を修正しなければならず、この作業もまた間違いやすくなりそうです。一方で、日時テーブルで時給をもっていなければ、時給テーブルの1レコードを修正すれば終わるかもしれません。 逆に、各従業員の日給や月給を高速に計算したい、という場合は、ANo.2の案は有力です。 もしくは、日時テーブルに日給をもたせる手も考えられます。 一般には、高速性を重視すると、間違いやすさ、とか整合性、とかテーブル容量は悪い方向になります。 データベース設計の一般的な手法として、ある程度まで正規化してから高速性を考慮して正規形を崩していく、というものがあります。 話は変わって、時給の履歴を管理したい、という目的がある場合は、時給テーブルに開始日、終了日を持つべきでしょう。 このあたりがデータベース設計のむずかしいところで、何を重視するかによって最適解は大きく変わってきます。

shinp
質問者

補足

>ANo.1 の案に類似ですが、時給テーブルを、 >開始日、終了日 >を加えることをおすすめします。 とはどのように行うのでしょうか。 時給テーブルは従業員番号、従業員名、時給です。ひとりの従業員に複数の時給を持たせることはできないのですか。

noname#22222
noname#22222
回答No.2

時給テーブルの時給はあくあまでも基準時給と考えるという手もあります。 となると、日時テーブルにも列<時給>が必要ということになります。 日時テーブルの列<時給>の既定値=時給テーブル<時給>という関係です。 日時テーブルの列<時給>が既定値から変更された場合、 「時給テーブルの時給も更新しますか?」 とやればと思います。

回答No.1

時給テーブルに、(有効)日付を追加してはいかがでしょうか? 最新の時給の日付は「9999/12/31」とします。 2006年5月26日に時給が800円→900円と変更となったなら、 800円、2006/5/26 900円、9999/12/31 のように登録します。 給与計算時は、日付テーブルの日付以上で一番小さい日付の時給を使います。

shinp
質問者

補足

>時給テーブルに、(有効)日付を追加してはいかがでしょうか? とはどのように行うのでしょうか。 時給テーブルは従業員番号、従業員名、時給です。ひとりの従業員に複数の時給を持たせることはできないのですか。

関連するQ&A

  • 【フリーウェイ給与計算】時給→月給に変更

    時給制の従業員が2023/4から正社員になり月給制に変更になりました。 従業員メニューでは時給で登録していましたが、月給に変更した場合に過去の給与明細も月給に書き換わってしまうのでしょうか。 時給の時の明細はそのまま残しておき、2023/4(5月支給分)から月給制で計算する方法を教えてください。 ※OKWAVEより補足:「フリーウェイジャパンの製品・サービス」についての質問です。

  • テキストファイルからの時間算出

    企業でシステム管理をしています。 現在勤怠管理システムで以下のようなテキストファイルをサーバに出力しています。このファイルと従業員ごとの時給テーブルを作成して人件費を出力するシステムを開発会社に作ってもらおうと思っています。 テキストファイル 社員番号,日付,業務開始,業務終了 1000234,20050901,1000,1830 1000444,20050901,1100,1930 2212334,20050901,1000,1900 1023455,20050901,1200,2030 時給テーブル 社員番号,時給 1000234,1000 1000444,900 2212334,900 1023455,1050 しかし開発会社は、出力されるテキストファイルからは時間を算出できないとの返答でした。 なぜなのでしょうか。テキストファイルの開始時間と終了時間を取り込めば労働時間は算出できると思うのですが、無理なのでしょうか。 よろしくお願いします。

  • 教えてください

    日付型データのテーブルを下のように変更する方法を教えてください (テーブル変更前) 日時 ―――――――――― 2002/05/31 13:54:28 2002/05/31 15:09:55 2002/06/01 10:40:06 2002/06/01 10:40:08 ―――――――――― (テーブル変更後) 日時 ―――――――――― 2002/05/31 2002/06/01 ―――――――――― よろしくお願いします

  • ACCESSのデータ型変更について

    クエリを利用してテーブルを新規作成する時に formatで書式を変換すると日付/時刻型のデータが テキスト型のデータに変わってしまったのですが 新規作成したテーブルのデータも日付/時刻型に直すには どのようにすれば出来ますか 宜しくお願いします 日時 (日付/時刻型) ―――――――――― 2002/05/31 13:54:28 2002/05/31 15:09:55 2002/06/01 10:40:06 2002/06/01 10:40:08 ――――――――――  ↓ テーブルの日時データを 日時:Format(日時,"日付 (L)")で書式を変換して テーブルを新規作成する  ↓ 日時 ―――――――――― 2002年5月31日 2002年6月1日 ――――――――――  ↓ テーブルの日時がテキスト型になってしまいます テキスト型を日付/時刻型に変更したい

  • ACCESSの日付に関してですが、休日の部分でデータの存在しない部分を無視して平均を出す方法を教えてください。

    ACCESSの日付に関してですが、休日の部分のテーブルデータが存在しなくてもクエリで日付に関して過去30日間などを行うとデータの無い部分は無い部分で無視して計算してしまい、結果として土日が休みですと過去22日分などでの計算になってしまいます。そのような計算ではなく例えばの言い方ですが、休みを除いた過去30営業日(テーブルに存在する日付のみ)での計算を行うにはどのようにしたら宜しいでしょうか?? ACCESSに詳しい方宜しくお願い致します。

  • Access 単価変更

    Accessで仕入管理を作成しています。 部品テーブルに登録してある単価を変更しても、過去のデーターは単価変更しないように設定にしたいのですが… 現在は、部品テーブルの部品番号と仕入テーブルの部品番号をリレーションシップの設定をしているので、過去のデーターも最新単価に変更されます。 どのような構成にしたら良いのか見当もつかなく困っています。 Access初心者なので、分かりやすく教えて頂けると助かります。 よろしくお願い致します。

  • ACCESS2000のクエリで、任意の日の時給を抽出したい

    ACCESS初心者です。 上級者の方には造作も無いことかもしれませんが、 この1点に悩んだまま、どうしても答えが出ないため、質問をしています。 目的は、クエリ中のフィールド名「勤務日」にあるレコード日(日付/時刻型、データは年月日のみ)に対応した「時給」を、テーブル「T_時給」からクエリに抽出したいのです。 この場合、発令日以降、同じ人に次の時給が発令がされるまでは、従前の時給を保持したいのです。 具体的には、以下の結果となるよう、<時給>のフィールドを自動的に求めたいのです。 テーブル「T_時給」 フィールド 「従業員ID」 「発令日」 「発令給」        (数値型) (日/時型) (通貨型)        1      2009/1/1   1000        1      2009/3/1   1500        1      2009/5/1   1300        2      2009/1/1   2000 クエリ「Q_給料」 フィールド 「従業員ID」 「勤務日」 <時給>        (数値型) (日/時型) (通貨型)         1     2009/1/1   1000         1     2009/2/2   1000         1     2009/3/3   1500         1     2009/4/4   1500         1     2009/5/5   1300         2     2009/1/1   2000         2     2009/2/2   2000 これまでの結果、クエリの<時給>の抽出条件に >=[T_時給]![発令日] と入力したところ、発令日が複数ある従業員では、時給の表示も複数抽出されて、レコードがダブってしまいます。 どうか、よろしくお願いします。

  • 時給の未払いに関して

    はじめまして、ちょっと複雑なケースなのですが相談に乗っていただきたいと思いまして、質問することにしました。 2年前に社員をやっている友人からアルバイトの誘いがありました。口頭で労働条件に関して時給850円、休日900円という条件を提示され、それを了承しアルバイトとして入社しました。 当然、雇用契約書を記入するのですが、文面の中に時給800円と記載されていました。ひとまず記入したあと、その場でその社員の友人に「これって850円になるんだよね?」と確認したところ、「直しておくよ」と言われ、そのまま職務につくようになりました。 その後、給与明細などもらっていたのですが、細かくチェックをしておらず、そのまま2年過ぎました。 たまたま、先日もらった明細を計算することになり、計算してみると時給800円のままの計算で給与の支払いをされていたことに気づきました。 過去の分も調べてみたところ、ずっと800円での計算になっていたようで、そのことを社員の友人に問いただしたところ、一度社長と相談してみるとのことでした。 相談してもらった結果、過去の分の給与は支払えないと言われました。 こういったケースの場合は、そのもらえなかった給与を今になって支払ってもらえないのでしょうか? 自分の中でも過失部分(給与の計算を確認していなかったことや契約書をその場で確実に変更してもらわなかったこと)があるのは、わかってるので半分あきらめてはいるのですが、計算すると結構な金額になるので、納得出来ない部分もあります。 何とかならないでしょうか?

  • access2000でデータの変更の内容がわかるようにしたいのですが。

    ACCESS初心者です。 ACCESS2000でフォームで既存レコードのどこかを更新したら、 (1)変更する前のデータをテーブル?で保存していきたい。(変更されたデータの過去分のデータをどんどん残していく。上書きはしない)&表示できれば尚うれしい。 (2)データを更新した日時も(1)と同じテーブルに書き込みたい。(こちらも(1)同様表示できれば尚うれしい)のです。 この作業はアクセスでできる?!と思っているのですが、 どなたかご教授頂ける方、よろしくお願いします。

  • Accessの変更の仕方

    すでに退社した人が作ったAccessの宛名ラベル用の様式を使いたいのですが、テーブルなどを変更してもまったく反映されません。例えば、郵便番号が5桁になっているのを現在の7桁に直そうとして、テーブルの入力文字数を変更しても、そのテーブルを閉じるとき「テーブルを変更しますか?」ともでてきませんし、修正画面で修正しようとしても、やはり5桁しか入力できない状態のままです。ロックされているとか、それとも別の方法があるのでしょうか?