表1:a_id, a_sum(总成本), a_peo(总人数),
表2:b_id, b_money(人均成本/日)a_id
表3:c_id, c_num(个人的总天数,每个人不一样) 这个c_num是通过表内两个日期相减而得到的字段。a_id
想求这个总成本,因为每个人的时间不一样 所以不知道该怎么去计算这个所有人加在一起的总成本,再传到数据库中的总成本字段里去。
要怎么来实现 sql或者java语句
现在总成本算了出来
SELECT
SUM( ( ( DATEDIFF( m.leave_date, m.enter_date ) / 30 ) * s.project_capita_cost ) ) 'practical_cost',
FROM
`project_member` m
INNER JOIN project_info i ON i.project_id = m.project_id
INNER JOIN salary_info s ON s.staff_id = m.staff_id
怎么存到对应的字段中呢
表2和表3中缺少个人的id,需要增加一个个人id,来把数据关联起来。然后2表和表3连表查出人均成本和天数的对应关系,然后遍历查出的结果,求出每个人的成本,将所有人的成本加起来就是中成本。
表:table_1(项目总成本记录表)
表:table_2(项目价目记录表)
表:table_3(项目成员工时记录表)
下面先来更新table_1中,项目id为1的总成本和总人员数
实际项目中请for下,这里是先设置下常量:
SET @aid=1
这里想知道这里面是什么值,可以看下:
SELECT @aid
下面是对表table_1中a_id为1的数据条目进行更新。(会计算这个项目的总成本及人数)
UPDATE table_1 as a,table_2 as b,table_3 as c
SET
a.a_sum = (
SELECT *
FROM(
SELECT
sum(b.b_money*c.c_num) as table_sum
FROM
table_1 as a
INNER JOIN table_2 as b ON b.a_id = a.a_id
INNER JOIN table_3 as c ON c.b_id = b.b_id
WHERE
a.a_id = @aid
) as table_4
WHERE
table_4.table_sum > 0
),
a.a_peo = (
SELECT *
FROM(
SELECT
COUNT(c.c_id) as table_sum
FROM
table_1 as a
INNER JOIN table_2 as b ON b.a_id = a.a_id
INNER JOIN table_3 as c ON c.b_id = b.b_id
WHERE
a.a_id = @aid
) as table_5
WHERE
table_5.table_sum > 0
)
WHERE
a.a_id = @aid
在实际使用中可以使用变量来替换@aid.
最后再来张在Navicat中的运行结果界面。
关联表是需要一个相同的字段
您好,可以类似这样写:
update TabA set a_sum = tab.a_sum
from
(
select b.a_id as a_id, b.b_money * c.c_num as a_sum
from TabB as b join TabC as c
on b.a_id = c.a_id
)tab
where tab.a_id = TabA.a_id