#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. По-прежнему выдает те же ответы