带有SUM结果和GROUP BY的MYSQL

时间:2012-07-18 11:44:39

标签: mysql group-by sum

我有这个查询,我想要汇总按omschrijving列分组的查询的所有结果。

查询

SELECT b.BoekRegelBedrag as total, c.omschrijving, ctl.vd1, b.BoekRegelId 
FROM condensations as c 
LEFT JOIN condensations_to_ledgers as ctl 
    ON ctl.vd1 = c.code
LEFT JOIN BoekstukRegels as b 
    ON b.BoekRegelGrootboekNr = ctl.GrootboekNummer 
LEFT JOIN GrootboekRekeningen as g 
    ON g.GrootboekNummer = ctl.GrootboekNummer
WHERE c.bedrijf_id = 118  
    AND b.BoekregelUserId = 118 
    AND ctl.bedrijf_id = 118 
    AND g.GrootboekUserId = 118 
    AND c.code < 10 
    AND g.BaSoort = 2
    AND b.BoekRegelPeriode BETWEEN 201000 AND 201013
 GROUP BY b.BoekRegelId

有一种简单的方法吗?

修改

我尝试了SUM BoekRegelBedrag但是然后每个记录以一种方式或另一种方式总结了一部分,我得到了4个结果而不是一个结果与总计列的总和

1 个答案:

答案 0 :(得分:1)

由于您没有明确规定哪些列应该求和,我们必须猜测。假设不应该对BoekRegelId列进行求和(对ID号进行算术很少有意义) - 然后不对每个注释求ctl.vd1 - 那么:

SELECT omschrijving, SUM(total) AS sum_total
  FROM (SELECT b.BoekRegelBedrag as total, c.omschrijving, ctl.vd1, b.BoekRegelId 
          FROM condensations AS c 
          LEFT JOIN condensations_to_ledgers AS ctl
            ON ctl.vd1 = c.code
          LEFT JOIN BoekstukRegels           AS b
            ON b.BoekRegelGrootboekNr = ctl.GrootboekNummer 
          LEFT JOIN GrootboekRekeningen      AS g
            ON g.GrootboekNummer = ctl.GrootboekNummer
         WHERE c.bedrijf_id = 118  
           AND b.BoekregelUserId = 118 
           AND ctl.bedrijf_id = 118 
           AND g.GrootboekUserId = 118 
           AND c.code < 10 
           AND g.BaSoort = 2
           AND b.BoekRegelPeriode BETWEEN 201000 AND 201013
         GROUP BY b.BoekRegelId
       ) AS I
  GROUP BY omschrijving;

基本上,我将原始查询结果用作FROM子句中的“表”,然后以可能是您所追求的方式聚合其列。

如果核心查询接近您想要的,那么另一种更简单的方法也是可行的:

SELECT c.omschrijving, SUM(b.BoekRegelBedrag) as total
  FROM condensations AS c 
  LEFT JOIN condensations_to_ledgers AS ctl ON ctl.vd1 = c.code
  LEFT JOIN BoekstukRegels           AS b   ON b.BoekRegelGrootboekNr = ctl.GrootboekNummer 
  LEFT JOIN GrootboekRekeningen      AS g   ON g.GrootboekNummer = ctl.GrootboekNummer
 WHERE c.bedrijf_id = 118  
   AND b.BoekregelUserId = 118 
   AND ctl.bedrijf_id = 118 
   AND g.GrootboekUserId = 118 
   AND c.code < 10 
   AND g.BaSoort = 2
   AND b.BoekRegelPeriode BETWEEN 201000 AND 201013
 GROUP BY c.omschrijving;