0

CostsPaymentsという 2 つのテーブルがあり、各コストの毎月の支払いの AVG を計算する必要があります。

つまり、Costs_IdCost = 2 には 3 回の支払いがあります

+-----------+--------------+----------+--------+
| IdPayment | Costs_IdCost |   Date   | Amount |
+-----------+--------------+----------+--------+
|     1     |      2       |2012/09/10|  1000  |
+-----------+--------------+----------+--------+
|     2     |      2       |2012/09/20|  3000  |
+-----------+--------------+----------+--------+
|     3     |      2       |2012/10/01|  5000  |
+-----------+--------------+----------+--------+

今、私は支払いの平均(3000)だけでなく、次の平均も必要です:

September : (1000+3000)/2 = 2000
October   : 5000 /1 = 5000
AVG       : (2000+5000)/2 = 3500

group by と subquery がかなり面倒です >_<

ありがとう!

- - - - - - - - - - 編集 - - - - - - - - - - - - - -

私はmySqlを使用しています。これは私がこれまでに行ったことです:

SELECT c.IdCost,
c.Name,
c.Amount,
AVG(p.monthly_sum) Mean,
SUM( p.Amount ) Total,
COUNT( p.IdPayment ) Num
FROM Costs c
LEFT JOIN (SELECT MONTH(Date), 
        YEAR(Date), 
                    Costs_IdCost,
                    IdPayment,
                    Amount,
        AVG (Amount) monthly_sum
    FROM Payments
    GROUP BY YEAR(Date), MONTH(Date) 
     ) p ON p.Costs_IdCost = c.IdCost
GROUP BY c.IdCost
4

3 に答える 3

2

これがまさにあなたが探しているものかどうかはわかりませんが、望ましい結果が得られます。

select date_format(date, '%Y-%m') Month,
  avg(amount) AvgAmount
from costs c
left join payments p
  on c.id = p.costs_idcost
group by date_format(date, '%Y-%m')
union all
select concat(cast(count(*) as char), ' Months Averaged'),
  avg(AvgAmount) TotalAvg
from
(
  select avg(amount) AvgAmount, 
    date_format(date, '%Y-%m') Month
  from costs c
  left join payments p
    on c.id = p.costs_idcost
  group by date_format(date, '%Y-%m')
) x

デモで SQL Fiddle を参照してください

于 2012-09-26T16:24:08.863 に答える
1

日付の月の部分でグループ化できます。

GROUP BY datepart(MONTH, Cost.Date)

これは最も効率的な方法ではないかもしれませんが、うまく機能する可能性があります。ところで、datepart は MSSQL の機能に組み込まれています。

于 2012-09-26T14:53:30.247 に答える
0

の選択エントリを使用して同様のことを行います

SELECT format(DATE_TIME,''yyyy-MM'') as [Month], .......

GROUP BY format(DATE_TIME,''yyyy-MM''), .........

SORT BY は、私が使用している GROUP BY と同じです。例が必要な場合、この概念で時間、分、秒のレベルに到達することさえできません。 SELECT format(DATE_TIME,''yyyy-MM-dd.HH'') as [Hour]

于 2015-08-14T18:23:04.560 に答える