Функция суммы SQL Server выдает x2 правильного значения суммы

#sql-server #sql-server-2008-r2

#sql-сервер #sql-server-2008-r2

Вопрос:

Следующий запрос, который дает значение totalDeduction 400, в то время как таблица tblDeduction имеет только 1 вычет со значением 200

 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
  

Пожалуйста, проверьте это

Спасибо

Комментарии:

1. Бьюсь об заклад, ваши условия объединения не равны 1: 1, удалите группу, чтобы посмотреть, что происходит. Кстати, рекомендуется использовать явный синтаксис соединения, а не неявный синтаксис до 92.

2. ТАК что задавайте вопросы, а не отправляйте свой код другим для исправления

3. @HoneyBadger что означает «условие соединения не 1: 1»? кстати, когда я удаляю предложение group by, оно выдает ошибку агрегированной функции

4. @JamesZ я прошу о помощи, не знаю, что вы получите от моего вопроса

5. Вредные привычки: использование объединений в старом стиле — этот стиль списка таблиц, разделенных запятыми , в старом стиле был заменен правильным JOIN синтаксисом ANSI в стандарте SQL ANSI- 92 ( более 20 лет назад), и его использование не рекомендуется

Ответ №1:

Два запроса не совпадают, потому что условие группировки отличается. Возможно, отсутствует условие, которое приводит к неточной группировке.

Из первого запроса я догадался, что отношение между таблицами похоже:

  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
  

Комментарии:

1. По-прежнему выдает те же ответы