Суммирование строк с использованием ROLLUP
Я написал запрос, который дает следующие результаты.
Запрос выглядит так
SELECT
rlrDivision.strLangue1 AS Division,
COUNT(p.pkPoste) AS NumbersToAdd,
SUM(p.iNbPostes) AS MoreNumbersToAdd
FROM
poste p
LEFT JOIN
lien_objet_ref_8 lienDiv ON lienDiv.fkObjet = p.pkPoste
LEFT JOIN
r_referentiel rrDivision ON rrDivision.pkReferentiel = lienDiv.fkReferentiel
LEFT JOIN
r_libelle_ref rlrDivision ON rlrDivision.pkLibelleRef = rrDivision.fkLib1
LEFT JOIN
lien_objet_liste_3 lol3 ON lol3.fkObjet = p.pkPoste AND lol3.`strContexte`='descriptif/type_contrat'
LEFT JOIN
r_liste_editable rle ON lol3.fkListe = rle.pkListeEditable
LEFT JOIN
r_libelle_ref rlr ON rle.fkLibelleRef = rlr.pkLibelleRef
WHERE
p.pkPoste <> 1
AND p.iSuppr <> 1
AND p.iDernierEtatPoste = 2
AND rlr.strLangue1 LIKE 'Full-time%'
GROUP BY
rlrDivision.strLangue1, p.`iNbPostes` WITH ROLLUP
Это почти дает правильные результаты. Тем не менее, я хотел бы иметь только одну строку для каждого отдела, который без ROLLUP у меня есть. Однако у меня нет желаемых итогов. Так что в основном я хочу то, что ниже, но с другой строкой для итогов по NumbersToAdd и MoreNumbersToAdd.
2 ответа
Ты можешь сделать UNION
:
SELECT
rlrDivision.strLangue1 AS Division,
COUNT(p.pkPoste) AS NumbersToAdd,
SUM(p.iNbPostes) AS MoreNumbersToAdd
FROM poste p
LEFT JOIN lien_objet_ref_8 lienDiv ON lienDiv.fkObjet = p.pkPoste
LEFT JOIN r_referentiel rrDivision ON rrDivision.pkReferentiel = lienDiv.fkReferentiel
LEFT JOIN r_libelle_ref rlrDivision ON rlrDivision.pkLibelleRef = rrDivision.fkLib1
LEFT JOIN lien_objet_liste_3 lol3 ON lol3.fkObjet = p.pkPoste AND lol3.`strContexte`='descriptif/type_contrat'
LEFT JOIN r_liste_editable rle ON lol3.fkListe = rle.pkListeEditable
LEFT JOIN r_libelle_ref rlr ON rle.fkLibelleRef = rlr.pkLibelleRef
WHERE p.pkPoste <> 1
AND p.iSuppr <> 1
AND p.iDernierEtatPoste = 2
AND rlr.strLangue1 LIKE 'Full-time%'
GROUP BY rlrDivision.strLangue1
UNION ALL
SELECT 'Total' as Division
, COUNT(p.pkPoste) as NumbersToAdd
, SUM(p.iNbPostes) AS MoreNumbersToAdd
FROM poste p
LEFT JOIN lien_objet_ref_8 lienDiv ON lienDiv.fkObjet = p.pkPoste
LEFT JOIN r_referentiel rrDivision ON rrDivision.pkReferentiel = lienDiv.fkReferentiel
LEFT JOIN r_libelle_ref rlrDivision ON rlrDivision.pkLibelleRef = rrDivision.fkLib1
LEFT JOIN lien_objet_liste_3 lol3 ON lol3.fkObjet = p.pkPoste AND lol3.`strContexte`='descriptif/type_contrat'
LEFT JOIN r_liste_editable rle ON lol3.fkListe = rle.pkListeEditable
LEFT JOIN r_libelle_ref rlr ON rle.fkLibelleRef = rlr.pkLibelleRef
WHERE p.pkPoste <> 1
AND p.iSuppr <> 1
AND p.iDernierEtatPoste = 2
AND rlr.strLangue1 LIKE 'Full-time%'
GROUP BY rlrDivision.strLangue1
;
Есть и другие ROLL UP
функции, доступные для выполнения итогов в запросе, но не уверены, поддержит ли это ваша база данных, так как вы не упомянули имя своей базы данных.
ROLLUP был правильным подходом, но так как много работы было потрачено на выяснение того, как правильно выполнить, я отвечаю на свой вопрос. Спасибо за вклад.
SELECT
rlrDivision.strLangue1 AS Division,
COUNT(p.pkPoste) AS NumbersToAdd,
SUM(p.iNbPostes) AS MoreNumbersToAdd
FROM poste p
LEFT JOIN lien_objet_ref_8 lienDiv ON lienDiv.fkObjet = p.pkPoste
LEFT JOIN r_referentiel rrDivision ON rrDivision.pkReferentiel = lienDiv.fkReferentiel
LEFT JOIN r_libelle_ref rlrDivision ON rlrDivision.pkLibelleRef = rrDivision.fkLib1
LEFT JOIN lien_objet_liste_3 lol3 ON lol3.fkObjet = p.pkPoste AND lol3.`strContexte`='descriptif/type_contrat'
LEFT JOIN r_liste_editable rle ON lol3.fkListe = rle.pkListeEditable
LEFT JOIN r_libelle_ref rlr ON rle.fkLibelleRef = rlr.pkLibelleRef
WHERE p.pkPoste <> 1
AND p.iSuppr <> 1
AND p.iDernierEtatPoste = 2
AND rlr.strLangue1 LIKE 'Full-time%'
GROUP BY rlrDivision.strLangue1 WITH ROLLUP