访问SQL:如何计算两个日期之间每个员工的工资(乘数)和工作日数(计数,不同)

时间:2012-09-21 12:52:17

标签: sql ms-access

我需要创建一个表单,根据我选择的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.   
  3. 必须从(pd_cost * pdtn_qty)计算工资。但是,pdtn_qty保存在“碎片”中,而pd_cost保存在“打”中。因此,公式应为(pdtn_qty * pd_cost)/ 12
  4.   
  5. 添加OT *没有。每个工人所做的加冕日(例如,约翰有2天的加时日,玛丽1加时日)
  6.   
  7. 必须扣除总工资,例如。 15 $ if if_social_sec为“TRUE”
  8.   
  9. 数不。每个员工工作的工作日。
  10.   

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

1 个答案:

答案 0 :(得分:1)

好的,这真的很乱。主要是因为Access没有COUNT(DISTINCT)选项。因此,计算工作日是一团糟。如果你可以跳过它,那么你可以删除所有pdn1,pdn2,pdn3的东西。但是ID确实有效。几个笔记 我认为你的数学在给出的例子中并不完全正确,我这样做: enter image description here

2我使用了IIF子句来模拟约翰的2个OT,1个用于玛丽。你需要改变它。祝你好运。

   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

希望这有帮助。