Суммирование строк с использованием 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
Другие вопросы по тегам