【问题标题】:Sum rows using ROLLUP使用 ROLLUP 对行求和
【发布时间】:2016-05-14 22:18:19
【问题描述】:

我编写了一个产生以下结果的查询。

查询看起来像

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 上有另一行总计。

【问题讨论】:

  • 什么是 RDBMS?是否支持ROLLUP
  • @GordonLinoff 抱歉,我更改了别名以便现在更有意义。
  • 我认为您应该将其存储在临时表或变量表中,然后执行两个查询,一个是简单的SELECT,另一个是这些字段的SUM()

标签: sql rollup


【解决方案1】:

你可以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 函数可用于查询总计,但不确定您的数据库是否支持,因为您没有提及您的数据库名称。

【讨论】:

  • @minatvermaj 我不确定这在 sqlPro 中是否可以接受 我收到错误 Unknown column 'MoreNumbersToAdd' in 'field list'
  • 实际上似乎支持 ROLLUP 但又不支持别名
  • @00robinette 我已经更新了答案。请检查一下。
  • 也不是这样。我会和它一起玩。该查询会产生 3 个额外的行,名为 title,其编号与分区相同 - 因此为 6、12、37 和 9、12 和 257。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 2013-11-11
    • 2014-05-30
    • 2018-02-02
    • 2017-01-18
    • 2014-10-06
    • 1970-01-01
    • 1970-01-01
    • 2016-11-20
    • 2021-12-04
    相关资源
    最近更新 更多