gpt4 book ai didi

mysql - MySQL JOIN 语句的问题

转载 作者:行者123 更新时间:2023-11-29 14:35:53 26 4
gpt4 key购买 nike

我有 5 个名为个人、每日工资、奖金、借条和贷款的表,我正在尝试编写一个查询,从该表生成工资单...我的代码是

 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()

它返回有奖金、借条和贷款记录的员工的姓名和空工资值。但我想对他们的每日工资求和,扣除/添加扣除或添加返回值,如果没有记录,则应继续求和,而不进行任何扣除或减去。

最佳答案

粘贴代码时您错过了一些内容,因为 loans 表没有连接。此外,您使用表 bonuses 作为值,您还需要一个字段名称。我为连接和字段添加了一些代码,但使用了 ??? 来表示我不知道的名称。

当您向其他内容添加或减去 null 值时,结果为 null,这就是为什么当左连接表中的任何值丢失时,您会得到 null 作为结果。您可以使用 ifnull(..., 0) 将 null 值转为零。

您需要一个group by子句,否则它将汇总所有人员的工资。

如果我没理解错的话,您的 dailypay 表中每个用户都有多条记录,但其他表中每个用户只有一条记录?在这种情况下,您会遇到问题,您将根据 dailypay 中的每一行连接其他表,因此,如果您有某个用户的 20 条付款记录,它将计算奖金 20 次。您可以使用像 max 这样的聚合来仅获取一次值。

您已将 left.joined 表的条件放入 where 子句中,但这会将联接转变为内联接。您应该在每个 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

关于mysql - MySQL JOIN 语句的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9062420/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com