2012-09-27 39 views
4

我有這個mysql查詢的問題。基本上我需要加入一個表(CostiFissi,具有成本表)與支付(Pagamenti)的表,按成本ID(CostiFissi_IdCostoFisso)將它們分組,計算的支付金額每月總和的平均值(不只是AVG (Totale))。mySQL SUM和COUNT問題,連接上的某些值得到加倍

即:9月和3000十月1000+到2000年間的平均水平應該回到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!

+1

您先加入然後分組。最好先組合,然後加入。它會快得多,作爲額外的獎勵,你也會得到正確的結果。 –

+0

DISTINCT,那是該死的魔法詞! :D 順便說一句,@MarkByers建議聽起來不錯ty :) –

回答

1

使用COUNT(DISTINCT)像這樣:

COUNT(DISTINCT p.IdPagamento) 

而不是COUNT(p.IdPagamento)