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. 工资是在我指定的两个日期之间计算的,例如。5/9/12 - 20/9/12
  2. 工资必须根据 (pd_cost * pdtn_qty) 计算。但是,pdtn_qty 被保存在“碎片”中,而 pd_cost 被保存在“打”中。因此公式应该是 (pdtn_qty * pd_cost)/12
  3. 添加 OT * 编号。每个工人加班的天数(例如约翰有 2 天加班,玛丽有 1 天加班)
  4. 必须扣除总工资,例如。15$ 如果 If_social_sec 为“真”
  5. 数数 每个员工工作的工作日。

我已经尝试过,但我无法将所有这些条件合并到一个 SQL 语句中,所以请你帮帮我。谢谢你。

4

1 回答 1

1

好的,这真的很乱。主要是因为 Access 没有 COUNT(DISTINCT) 选项。所以计算工作日是一团糟。如果你可以跳过它,那么你可以删除所有 pdn1、pdn2、pdn3 的东西。但 id 确实有效。几点注意事项 1. 我认为你的数学在给出的例子中不太正确,我是这样写的: 在此处输入图像描述

2 我使用 IIF 子句来模拟 2 OT 代表 john,1 代表 mary。你需要改变它。祝你好运。

   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

可以添加不在生产表中的项目,您需要附加如下内容:

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 回答