mySQL SUM 和 COUNT 问题,连接上的一些值加倍

Posted

技术标签:

【中文标题】mySQL SUM 和 COUNT 问题,连接上的一些值加倍【英文标题】:mySQL SUM and COUNT issue, some values on join get doubled 【发布时间】:2012-09-18 23:07:34 【问题描述】:

我对这个 mysql 查询有疑问。基本上我需要将一张表(CostiFissi,一张有成本的表格)与一张有付款的表格(Pagamenti)连接起来,按成本ID(CostiFissi_IdCostoFisso)对它们进行分组并计算平均值每月付款金额之间的总和(不仅仅是 AVG(Totale) )。

即:9 月的 1000+2000 和 10 月的 3000 之间的平均值应该返回 2250 而不是 3000

这是我到目前为止所做的:

SELECT `cf`.`IdCostoFisso`, 
       `cf`.`Nome`, 
       `cf`.`Frequenza`, 
       `cf`.`Importo`, 
       `cf`.`DateFrom`, 
       `cf`.`DateTo`, 
        SUM( p.Totale ) PagamentiTotale, 
        COUNT( p.IdPagamento ) PagamentiNum, 
        AVG(p2.somma_mese) Media 
 FROM (`CostiFissi` cf) 
 LEFT JOIN `Pagamenti` p ON `p`.`CostiFissi_IdCostoFisso` = `cf`.`IdCostoFisso` 
 LEFT JOIN (
             SELECT MONTH(Data), 
                    YEAR(Data), 
                    CostiFissi_IdCostoFisso, 
                    SUM(Totale) somma_mese 
             FROM Pagamenti 
             GROUP BY YEAR(Data), 
                      MONTH(Data), 
                      CostiFissi_IdCostoFisso 
           ) AS p2 ON `p2`.`CostiFissi_IdCostoFisso` = `cf`.`IdCostoFisso` 
  WHERE `cf`.`DateTo` > '2012-09-27 09:46:14' 
         AND `p`.`Data` >= '2012-01-01 00:00:01' 
         AND `p`.`Data` <= '2012-12-31 23:59:59' 
  GROUP BY `cf`.`IdCostoFisso`

当我运行查询时,我遇到了这个问题:假设我有 2 个成本,cost_a(w/3 付款)和 cost_b(w/1 付款),我得到了两者的正确平均值(正如我想要的那样计算)但 COUNT(p.IdPagamento) 为 cost_a 返回 6(而不是 3),为 cost_b 返回 1。对于 SUM (p.Totale) 也是如此,对于 cost_a 而不是 cost_b 翻倍。

可能是表 p 加入的问题,不知道……我花了一段时间才达到这一点,但现在有点混乱,我无法进一步了解 >_

ty!

【问题讨论】:

你先加入再分组。最好先分组,然后加入。它会更快,并且作为额外的奖励,您还将获得正确的结果。 DISTINCT,那是该死的神奇词! :D 顺便说一句,@MarkByers 的建议听起来也不错 :) 【参考方案1】:

像这样使用COUNT(DISTINCT)

COUNT(DISTINCT p.IdPagamento)

而不是COUNT(p.IdPagamento)

【讨论】:

以上是关于mySQL SUM 和 COUNT 问题,连接上的一些值加倍的主要内容,如果未能解决你的问题,请参考以下文章

Mysql表读写索引等操作的sql语句效率优化问题

MYSQL:在多行选择中使用 COUNT 和 SUM 函数的问题

Spark连接到MySQL并执行查询为啥速度会快

mysql连接上的空白页

MySQL:如何优化字段 SUM 的结果?

SQL sum和count的连接关系