select personal.name as NAME,
(sum(dailypay.pay) + bonuses) - (iou.amount + loans.monthly_due)) as SALARY
from personal
join dailypay on personal.eid = dailypay.eid
left join bonuses on personal.eid = bonuses.eid
left join iou on personal.eid = iou.eid
left join where dailypay.date = 'specified_date'
and bonuses.date_approved = 'specified_date'
and iou.date_approved = 'specified_date'
and loans.date = month(now()
它返回具有奖金,iou和贷款记录的员工的姓名和空薪水值。但我想总结他们的每日支付,扣除/增加扣除或增加返回值,如果没有记录它应继续进行总和而不做任何扣除或减法。
答案 0 :(得分:1)
粘贴代码时错过了一些内容,因为loans
表没有连接。此外,您使用表bonuses
作为值,您还需要一个字段名称。我为联接和字段添加了一些代码,但是使用了???
来表示我不知道的名称。
当您向其他内容添加或减去空值时,结果为null,这就是当缺少左连接表中的任何值时,结果为null的原因。您可以使用ifnull(..., 0)
将空值转换为零。
你需要一个group by
条款,否则它会总结所有人的工资。
如果我说得对,那么每个用户的dailypay
表中有几条记录,但其他表中每个用户只有一条记录?在这种情况下,您遇到的问题是,您将在dailypay
中的每一行加入其他表,因此如果您有20个用户付款记录,则会将奖励计为20次。您可以使用max
之类的聚合来获取值一次。
您已在where
子句中为left.joined表添加条件,但这会将连接转换为内连接。您应该在每个join
子句中都有这些条件。
select
personal.name as NAME,
(sum(dailypay.pay) + ifnull(max(bonuses.???), 0)) - (ifnull(max(iou.amount), 0) + ifnull(max(loans.monthly_due), 0)) as SALARY
from
personal
inner join dailypay on personal.eid = dailypay.eid
left join bonuses on personal.eid = bonuses.eid and bonuses.date_approved = 'specified_date'
left join iou on personal.eid = iou.eid and iou.date_approved = 'specified_date'
left join loans on personal.??? = loans.??? and loans.date = month(now())
where
dailypay.date = 'specified_date'
group by
personal.name
答案 1 :(得分:0)
left join
之前似乎有一个无关的where
,而)
month(now()
所以看起来应该是这样的:
select personal.name as NAME,
(sum(dailypay.pay) + bonuses) - (iou.amount + loans.monthly_due)) as SALARY
from personal
join dailypay on personal.eid = dailypay.eid
left join bonuses on personal.eid = bonuses.eid
left join iou on personal.eid = iou.eid
where dailypay.date = 'specified_date'
and bonuses.date_approved = 'specified_date'
and iou.date_approved = 'specified_date'
and loans.date = month(now())