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 问题,连接上的一些值加倍的主要内容,如果未能解决你的问题,请参考以下文章