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.