0

選択した Date_start と Date_end に従って、各従業員の賃金を集計するフォームを作成する必要があります。

私は3つの関連するテーブルを持っています。

tbl_labor
 lb_id | lb_name  | lb_OT ($/day) | If_social_sec
   1   |  John    |    10         |    yes
   2   |  Mary    |    10         |    no

tbl_production 
pdtn_date  | lb_id  | pdtn_qty(pcs) | pd_making_id 
 5/9/12    |   1    |     200       |    12
 5/9/12    |   1    |     40        |    13
 5/9/12    |   2    |     300       |    12
 7/9/12    |   1    |     48        |    13
 13/9/12   |   2    |     220       |    14
 15/9/12   |   1    |     20        |    12
 20/9/12   |   1    |     33        |    14
 21/9/12   |   2    |     55        |    14
 21/9/12   |   1    |     20        |    12

tbl_pdWk_process 
pd_making_id | pd_cost($/dozen) | pd_id 
    12       |     2            |   001
    13       |     5            |   001
    14       |     6            |   002

結果は次のようになります。

lb_name | no.working days | Total($)| OT payment | Social_sec($)| Net Wage             | 
  John  |        4        |  98.83  |  20 (2x10) |     15       |  103.83 (98.83+20-15)|
  Mary  |        2        |  160    |  10 (1x10) |     0        |  170 (160+10-0)      | 

私の条件は次のとおりです。

  1. 賃金は、指定した 2 つの日付の間で計算されます。2012 年 9 月 5 日 - 2012 年 9 月 20 日
  2. 賃金は (pd_cost * pdtn_qty) から計算する必要があります。ただし、pdtn_qty は「ピース」に保持されていましたが、pd_cost は「ダース」に保持されていました。したがって、式は (pdtn_qty * pd_cost)/12 になります。
  3. OT * 番号を追加します。各ワーカーが行った OT の日数 (例: ジョンは 2 OT 日、メアリーは 1 OT 日)
  4. 総賃金を差し引く必要があります。If_social_sec が「TRUE」の場合は 15$
  5. カウントNo. 各従業員が働いた営業日の。

試してみましたが、このすべての条件を 1 つの SQL ステートメントにまとめることはできませんでした。ありがとうございました。

4

1 に答える 1

1

OK、これは本当に厄介です。主な理由は、Access に COUNT(DISTINCT ) オプションがないためです。そのため、稼働日を数えるのは面倒です。それをスキップできる場合は、すべての pdn1、pdn2、pdn3 のものを削除できます。しかし、idは機能します。いくつかのメモ 1.与えられた例ではあなたの数学はまったく正しくないと思います。私は次のようにします: ここに画像の説明を入力

2 IIF 句を使用して、ジョンの 2 つの OT、メアリーの 1 つの OT をシミュレートしました。それを変更する必要があります。幸運を。

   select
  lab.lb_name,
  max(days),
  sum(prod.pdtn_qty * pdWk.pd_cost / 12) as Total ,
  max(lab.lb_OT * iif(lab.lb_id=1,2,1)) as OTPayment,
  max(iif(lab.if_social_sec='yes' , 15,0 )  ) as Social_Sec,
  sum(prod.pdtn_qty * pdWk.pd_cost / 12.00) +
  max(lab.lb_OT * iif(lab.lb_id=1,2,1)) -
  max(iif(lab.if_social_sec='yes' , 15,0 )  ) as NetWage
from
  tbl_labor as lab,
  tbl_production as prod,
  tbl_pdWk_process as pdwk,

(select pdn2.lb_id, count(pdn2.lb_id) as days from
  (select  lb_id
  from tbl_production  pdn1
  where pdn1.pdtn_date >= #9/5/2012#
  and   pdn1.pdtn_date <= #2012-09-20#
  group by lb_id, pdtn_date ) as pdn2
     group by pdn2.lb_id) as pdn3

where prod.pdtn_date >= #9/5/2012#
and   prod.pdtn_date <= #2012-09-20#
and prod.lb_id = lab.lb_id
and   prod.pd_making_id = pdwk.pd_making_id
and lab.lb_id = pdn3.lb_id
group by lab.lb_name

production テーブルにない項目を追加しても構いません。次のようなものを追加する必要があります。

Union
select lab.lb_name,
0,
0,
max(lab.lb_OT * iif(lab.lb_id=1,2,1)) ,
max(iif(lab.if_social_sec='yes' , 15,0 )  ),0
from tbl_labor lab
where lb_id not in ( select lb_id from tbl_production   where pdtn_date >= #2012-09-05#      and   pdtn_date <= #2012-09-20#  )
group by lab.lb_name

お役に立てれば。

于 2012-09-21T15:56:35.047 に答える