【问题标题】:SQL AVG and SUM GROUP BYSQL AVG 和 SUM GROUP BY
【发布时间】:2012-09-18 05:35:01
【问题描述】:

我有两个表格,分别是 CostsPayments,我需要计算每个费用的每月支付的 AVG。

即Costs_IdCost = 2 有三笔付款

+-----------+--------------+----------+--------+
| 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

【问题讨论】:

  • 向我们展示你目前拥有的东西。
  • TSQL、MySQL、Oracle、...?

标签: mysql subquery sum average


【解决方案1】:

我不确定这是否正是您正在寻找的,但它会给您带来想要的结果:

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 with Demo

【讨论】:

    【解决方案2】:

    您可以按日期的月份部分分组。

    GROUP BY datepart(MONTH, Cost.Date)
    

    这可能不是最有效的方法,但可能效果很好。 BTW datepart 是内置于 MSSQL 的函数中。

    【讨论】:

      【解决方案3】:

      我通过使用

      的选择条目来做类似的事情
      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]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-18
        相关资源
        最近更新 更多