2016-10-02 83 views
0

以下查询这给400值totalDeduction的同时tblDeduction表仅具有1扣除与值的X2 200SQL Server的总和函数给出正确的总和值

select 
    e.EmpID, concat(e.FName, ' ', e.LName) as Name, 
    o.HireDate, o.BasicPay, s.Scale, 
    SUM(a.amount) as totalAllowance, 
    SUM(d.Amount) as totalDeduction 
from 
    tblEmployee e, tblEmpOfficialDetail o, tblScale s, tblAllowance a, tblDeduction d 
where 
    e.EmpID = o.EmpID and 
    o.ScaleID = s.ID and 
    o.ScaleID = a.ScaleID and 
    o.ScaleID = d.ScaleID 
group by 
    e.EmpID, e.FName, e.LName, o.HireDate, o.BasicPay, s.Scale 

当我使用相同的逻辑写一个单独的查询它会返回正确的答案。

select 
    sum(d.amount), o.scale 
from 
    tblDeduction d, tblScale o 
where 
    d.ScaleID = o.ID 
group by 
    o.Scale 

请检查,因为分组条件不同,它

感谢

+5

我敢打赌,您的加入条件不是1:1,请删除群组以查看发生了什么。顺便说一下,建议使用显式连接语法,而不是使用92之前的隐式语法。 – HoneyBadger

+0

SO用于提问,不提交代码供其他人修复 –

+0

@HoneyBadger“连接条件不是1:1”是什么意思?顺便说一句,当我删除组by子句它给聚合函数错误 – Ridzi

回答

0

这两个查询是不一样的。 它可能缺少导致分组不准确的情况。

tblEmployee e 
    |--> tblEmpOfficialDetail o 
      |-->tblDeduction d 
      |-->tblScale  s 
      |-->tblAllowance a 

尝试下一个查询:

我从第一查询表之间的关系就像是猜测。这是相同的,但是从连接表之间的关系确定为连接条件。

select e.EmpID, concat(e.FName, ' ', e.LName) as Name , 
    o.HireDate, o.BasicPay, s.Scale, SUM(a.amount) as totalAllowance,SUM(d.Amount) as totalDeduction 
    from tblEmployee e 
    join tblEmpOfficialDetail o on e.EmpID=o.EmpID 
    join tblDeduction d on o.ScaleID=d.ScaleID 
    join tblScale s on s.ID=o.ScaleID 
    join tblAllowance a on a.ScaleID = o.ScaleID 
    group by e.EmpID, e.FName, e.LName, o.HireDate, o.BasicPay, s.Scale 
+0

仍给同样的答案 – Ridzi