4

このmysqlクエリに問題があります。基本的に、1つのテーブル(CostiFissi、コストのあるテーブル)を支払いのあるテーブル(Pagamenti)と結合し、それらをコストID( CostiFissi_IdCostoFisso)でグループ化し、毎月の支払い額の合計(AVG(Totale)だけでなく)の平均を計算する必要があります。 。

つまり、9月の1000+2000と10月の3000の間の平均は3000ではなく2250を返すはずです

これは私がこれまでにしたことです:

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`

クエリを実行したときよりも、この問題が発生します。たとえば、cost_a(w / 3支払い)とcost_b(w / 1支払い)の2つのコストがあるとすると、両方の正しい平均が返されます(計算したいので)ただし、COUNT(p.IdPagamento)は、cost_aの場合は6(3ではなく)を返し、cost_bの場合は1を返します。SUM(p.Totale)についても同じですが、cost_bではなくcost_aで2倍になります。

テーブルpの結合の問題かもしれませんが、わかりません…このポイントに到達するまでにしばらく時間がかかりましたが、今は少し面倒で、それ以上進むことができません> _ <

ty!

4

1 に答える 1

1

COUNT(DISTINCT)そのように使用します:

COUNT(DISTINCT p.IdPagamento)

の代わりにCOUNT(p.IdPagamento)

于 2012-09-27T08:13:22.670 に答える