In plaats van lid te worden van tbl_workers je zou kunnen aansluiten bij de niet-gedraaide variant waar position en position2 zou in dezelfde kolom staan, maar in verschillende rijen.
Zo zou het ongedaan maken van de draai eruit kunnen zien:
SELECT
w.id,
w.name,
CASE x.pos WHEN 1 THEN w.position ELSE w.position2 END AS position,
w.status
FROM tbl_workers AS w
CROSS JOIN (SELECT 1 AS pos UNION ALL SELECT 2) AS x
Dit is de volledige zoekopdracht, die in feite uw oorspronkelijke zoekopdracht is, waarbij de bovenstaande zoekopdracht de tbl_workers vervangt tafel:
SELECT p.id,
p.position,
SUM(CASE w.Status WHEN 2 THEN 1 ELSE 0 END) AS booked,
SUM(CASE w.Status WHEN 3 THEN 1 ELSE 0 END) AS placed
FROM tbl_positions AS p
LEFT JOIN (
SELECT
w.id,
w.name,
CASE x.pos WHEN 1 THEN w.position ELSE w.position2 END AS position,
w.status
FROM tbl_workers AS w
CROSS JOIN (SELECT 1 AS pos UNION ALL SELECT 2) AS x
) AS w
ON w.position=p.id
GROUP BY p.id, p.position
UPDATE
Dit is een aangepast script volgens aanvullend verzoek in opmerkingen:
SELECT p.id,
p.position,
SUM(CASE w.Status WHEN 2 THEN 1 ELSE 0 END) AS booked,
SUM(CASE w.Status WHEN 3 THEN 1 ELSE 0 END) AS placed
FROM tbl_positions AS p
LEFT JOIN (
SELECT
w.id,
w.name,
CASE x.pos WHEN 1 THEN w.position ELSE w.position2 END AS position,
CASE w.status
WHEN 4 THEN CASE x.pos WHEN 1 THEN 3 ELSE 2 END
ELSE w.status
END AS status
FROM tbl_workers AS w
CROSS JOIN (SELECT 1 AS pos UNION ALL SELECT 2) AS x
) AS w
ON w.position=p.id
GROUP BY p.id, p.position
Het idee is om de 4 . te vervangen status in de subselectie met 3 of 2 afhankelijk van of we op dit moment position . moeten halen of position2 als de verenigde position . De buitenste select blijft dezelfde logica gebruiken als voorheen.