Zamiast dołączać do tbl_workers
możesz dołączyć do jego nieobrotowej odmiany, gdzie position
i position2
będzie w tej samej kolumnie, ale w różnych rzędach.
Oto jak może wyglądać unpivoting:
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
Oto całe zapytanie, które jest w zasadzie Twoim pierwotnym zapytaniem z powyższym zapytaniem zastępującym tbl_workers
tabela:
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
AKTUALIZUJ
To jest zmodyfikowany skrypt zgodnie z dodatkową prośbą w komentarzach:
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
Pomysł polega na zastąpieniu 4
status w podselekcji za pomocą 3
lub 2
w zależności od tego, czy aktualnie mamy ciągnąć position
lub position2
jako ujednolicona position
. Zewnętrzny wybór nadal używa tej samej logiki, co wcześniej.