Лучший подход в нашем случае - агрегировать перед выполнением объединений.У вас есть четыре различных агрегата, которые вам нужны:
master
по pUnitName
master
по WardName
accreditation
по pUnitName
res
от pUnitName`
Затем LEFT JOIN
это вместе:
SELECT m.pUnitName, m.userCode,
SUM(m.pvc_collected) as pvc,
SUM(m.voter_reg_no) AS purvs,
mw.Num_Poll_Units, mw.reportedpu,
mu.Num_Poll_Units, mu.reportedpu,
a.acr,
r.tvc, r.apc, . . .
FROM master m LEFT JOIN
(SELECT m2.wardName, COUNT(*) as Num_Poll_Units,
SUM(m2.reportedpu = 1) as reportedpu
FROM master m2
GROUP BY m2.wardName
) mw
USING (wardname) LEFT JOIN
(SELECT m2.pUnitName, COUNT(*) as Num_Poll_Units,
SUM(m2.reportedpu = 1) as reportedpu
FROM master m2
GROUP BY m2.pUnitName
) mu
USING (pUnitName) LEFT JOIN
(SELECT a.pu_name, SUM(a.total) as acr
FROM accreditation a
GROUP BY a.pu_name
) a
ON a.pu_name = m.pUnitName LEFT JOIN
(SELECT r.pUnitName,
SUM(CASE WHEN category = 'tvc' THEN cno ELSE 0 END) as tvc,
SUM(CASE WHEN category = 'apc' THEN cno ELSE 0 END) as apc,
. . .
FROM res r
GROUP BY r.pUnitNmae
) r
USING (pUnitName)
GROUP BY m.pUnitName, m.userCode,
mw.Num_Poll_Units, mw.reportedpu,
mu.Num_Poll_Units, mu.reportedpu,
a.acr,
r.tvc, r.apc, . . .
ORDER BY m.userCode ASC;
Примечание: самый внешний запрос не агрегирует по WardName
,Не ясно, что вы действительно хотите для этих столбцов.Вам может потребоваться сделать следующее:
- Удалить
mw.Num_Poll_Units
и mw.reportedpu
из GROUP BY
. - Изменить
SELECT
на SUM(mw.Num_Poll_Units)
или AVG(mw.Num_Poll_Units)
или любую другую подходящую функцию.