我需要创建一个表单,根据我选择的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) |
我的条件是:
- 工资是在我指定的两个日期之间计算的,例如。 5/9/12 - 20/9/12
- 必须从(pd_cost * pdtn_qty)计算工资。但是,pdtn_qty保存在“碎片”中,而pd_cost保存在“打”中。因此,公式应为(pdtn_qty * pd_cost)/ 12
- 添加OT *没有。每个工人所做的加冕日(例如,约翰有2天的加时日,玛丽1加时日)
- 必须扣除总工资,例如。 15 $ if if_social_sec为“TRUE”
- 数不。每个员工工作的工作日。
醇>
我已经尝试但是我无法在一个SQL语句中将所有这些条件合并在一起,所以,请你帮帮我。谢谢。
答案 0 :(得分:1)
好的,这真的很乱。主要是因为Access没有COUNT(DISTINCT)选项。因此,计算工作日是一团糟。如果你可以跳过它,那么你可以删除所有pdn1,pdn2,pdn3的东西。但是ID确实有效。几个笔记 我认为你的数学在给出的例子中并不完全正确,我这样做:
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
希望这有帮助。