【问题标题】:SQL - monthly average rather than daily averageSQL - 月平均值而不是日平均值
【发布时间】:2012-09-13 15:08:13
【问题描述】:

我有一个名为 values 的表,其中包含 3 列 - 位置、值、日期

我想算出每个月的平均值

到目前为止我有

SELECT Location, Avg(value), date  
FROM Value  
GROUP BY Location, date 

这会返回平均值,但每天输入一个值,所以我有一个每天的平均值而不是每月的平均值,我怎样才能达到每月平均值?

【问题讨论】:

  • 欢迎来到 SO,@user1505127。如果您找到一个可行的答案,请给它一个绿色检查来表示信任。这就是我们觉得有用的方式:)
  • 年份信息呢?如果您只指定月份,则每年的同一月份将被平均在一起(即 AVG January in 2011 AND 2012 等)。与包含年份信息相反(因此,2012 年 1 月的 AVG 不同于 2011 年 1 月等)。

标签: sql sql-server sql-server-2008 tsql


【解决方案1】:

试试这个:

SELECT    Location,
          Avg(value),
          month(date),
          year(date)
FROM      Value
GROUP BY  Location,
          month(date),
          year(date)

【讨论】:

  • 我认为您在第一个 month(date) 之后缺少逗号。
【解决方案2】:

如果您想要仅按月份分组,您可以使用以下方法:

SELECT Location, Avg(value) AvgVal, Month(date) Mnth
FROM Value
GROUP BY Location, Month(date)

您甚至可以使用GROUPING SETS,它将GROUP BY 月、年、位置,然后为您提供所有总数:

SELECT Location, 
  Avg(value) AvgVal, 
  Month(dt) Mnth,
  Year(dt) Yr
FROM yourtable
GROUP BY 
  GROUPING SETS((Month(dt), Year(dt), Location), (Location));

SQL Fiddle with Demo

【讨论】:

    【解决方案3】:
    SELECT
         Location,
         year(date),
         month(date),
         Avg(value)
    FROM
         Value
    GROUP BY
         Location,
         year(date),
         month(date)
    

    【讨论】:

      【解决方案4】:

      如果您想将日期合并到一个列中,以每月的第一天为日期,也可以这样做。

      SELECT    Location,
                Avg(value),
                DateFromParts(Year(date), Month(date) , 1) AS FirstOfMonthDate
      FROM      Value
      GROUP BY  Location,
                DateFromParts(Year(date), Month(date) , 1)
      

      【讨论】:

        猜你喜欢
        • 2020-07-09
        • 1970-01-01
        • 2020-03-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多