Мне немного непонятно, является ли place.position_id тем же столбцом, что и place.pos_id, и является ли worker.position2 таким же, как worker.pos2.Во всяком случае, я предположил, что они не равны, то есть точно так, как описано в вопросе.
Попробуй - может потребоваться подстройка столбца в зависимости от имени_позиции против_положения_позиции2 и позиции2:
SELECT employers.employer_name, p.position_name,
case when w.position2 = p.position_id then p.position_name else 'no worker position found' end as worker_position_name,
SUM(CASE WHEN w.type = 2 THEN 1 ELSE 0 END) AS booked,
SUM(CASE WHEN (w.type = 3 OR w.type = 31) THEN 1 ELSE 0 END) AS placed
FROM places AS p
LEFT JOIN employers ON employers.id = places.employer
LEFT JOIN (
SELECT
w.id,
w.user_id,
CASE x.pos WHEN 1 THEN w.pos1 ELSE w.pos2 END AS position,
CASE w.type
WHEN 39 THEN CASE x.pos WHEN 1 THEN 3 ELSE 2 END
ELSE w.type
END AS type,
w.pos2
FROM workers AS w
CROSS JOIN (SELECT 1 AS pos UNION ALL SELECT 2) AS x
) AS w
ON w.position = p.pos_id
GROUP BY p.pos_id, p.pos_name,w.position2,p.position_id,p.position_name
ORDER BY p.emp_id ASC, p.pos_id ASC;
Удачи!