Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Составление SQL-запросов > объединение данных из неск.таблиц


Автор: motorway 10.9.2008, 15:32
Есть таблица с id людей и их именами, с id людей и зарплатами, с id людей и премиями, с id людей и штрафами.
Как написать запрос, выводящий для всех людей суммарные деньги=зарплата+все премии-все штрафы?
MS SQL

Автор: Akina 10.9.2008, 16:06
Руками, блин!

Код

select p.name, (isnull(s.sum,0)+isnull(b.sum,0)-isnull(f.sum,0)) as sum
from people as p
left join salary as s
  on p.id=s.id
left join bonus as b
  on p.id=b.id
left join fine as f
  on p.id=b.id
group by p.id

Автор: motorway 10.9.2008, 16:30
Понимаю, что не ногами. После изменения названий на мои, получаю ошибку:
Column 'employees.name' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause.
И, кстати, в последнем join, там не p.id=f.id должно быть?

Автор: Akina 10.9.2008, 21:11
Цитата(motorway @  10.9.2008,  17:30 Найти цитируемый пост)
После изменения названий на мои, получаю ошибку:

Ну так дай СВОИ названия. А лучше структуру таблиц с указанием ключей и связей.

Цитата(motorway @  10.9.2008,  17:30 Найти цитируемый пост)
И, кстати, в последнем join, там не p.id=f.id должно быть?

Конечно. Издержки копипаста.

Автор: motorway 10.9.2008, 22:09
Названия я просто изменил, суть не в этом. Если как в твоих названиях, то ошибка была бы "p.name ..." (у меня employees). Правильно ли я понимаю, что условие выбора - одинаковые id во всех таблицах, т.е. относятся к одному человеку? Можно ли это сделать как 
where
Код

Employees.id=bonus.id and Employees.id=fine.id and Employees.id=salary.id
?

Еще проблема у меня в том, что если хотя бы одного поля у человека нет, напр., нет штрафов, то он не выводится в рез-те. Но isnull у меня не помогает.
---
вот сделал код путем проб, здесь названия таблиц другие, но это не важно, суть понятна
Код

select p.name, (isnull(s.summ,0)+isnull(sum(reward),0)-isnull(sum(punish),0)) as sum
from employees as p
left join summ as s
  on p.id=s.id
left join rewards as b
  on p.id=b.id
left join puns as f
  on p.id=f.id
group by p.name,s.summ

Но не совсем его понял до конца

Автор: Akina 11.9.2008, 17:41
Цитата(motorway @  10.9.2008,  23:09 Найти цитируемый пост)
если хотя бы одного поля у человека нет, напр., нет штрафов, то он не выводится в рез-те.

Прочтите внимательно ман по тому, чем отличаются Full, Left/Right и Inner связывания. До полного понимания.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)