Не удержался , просто красиво ...
code:
SELECT d.DeptName, p.code, p.PosName, count(*) as all_count,
w.Salary as Salary,
w.Bonus1 as Bonus1,
w.Bonus2 as Bonus2,
w.Bonus3 as Bonus3,
rtrim(e.lastname) as f,
rtrim(e.firstname) as i,
rtrim(e.middlename) as o
FROM Struc s
INNER JOIN Positions p ON p.id_pos = s.id_struc
INNER JOIN Worker w ON s.id_worker = w.id_worker
LEFT JOIN Empl e ON w.id_empl = e.id_empl
INNER JOIN Departments d ON s.id_dept = d.id_dept
WHERE s.id_struc in (65, 68, 69, 66, 40, 70, 71)
GROUP BY d.DeptName, p.code, rtrim(e.lastname),rtrim(e.firstname),rtrim(e.middlename),
p.PosName,
w.Salary, w.Bonus1, w.Bonus2, w.Bonus3,
s.DeptOrder
UNION
SELECT d.DeptName, p.code, p.PosName, count(*) as all_count,
p.Salary as Salary,
p.Bonus1 as Bonus1,
p.Bonus2 as Bonus2,
p.Bonus3 as Bonus3,
rtrim(e.lastname) as f,
rtrim(e.firstname) as i,
rtrim(e.middlename) as o
FROM Struc s
INNER JOIN Positions p ON p.id_pos = s.id_struc
INNER JOIN Departments d ON s.id_dept = d.id_dept
left join worker w on worker.id_worker = struc.id_worker
LEFT JOIN empl e ON (worker.id_empl=empl.id_empl)
WHERE (s.id_struc in (65, 68, 69, 66, 40, 70, 71)) and (s.id_worker is null)
GROUP BY d.DeptName, p.code,
rtrim(e.lastname),
rtrim(e.firstname),
rtrim(e.middlename),
p.PosName,
p.Salary, p.Bonus1, p.Bonus2, p.Bonus3,
s.DeptOrder