【问题标题】:Group by and Aggregate in ms sql在 ms sql 中分组和聚合
【发布时间】:2011-10-21 10:56:53
【问题描述】:

dbo.edp_GetNumDaysInMonth() 是用户定义的函数。

select 
   month(a.enddatetime),
cast(((dbo.edp_GetNumDaysInMonth(a.enddatetime)) * 22.5 - (isnull(sum(a.delayhr),0)/3600.00)) / count(a.machine_no) as decimal(11,2)) as MTBF 
from mro_maint a 
   left join mro_machine b on a.machine_no = b.machine_no 
where (b.section = 'TRANSMISSION' OR b.section = 'EATON LINE' OR b.section = 'TOYOTA') 
group by month(a.enddatetime)

消息 8120,级别 16,状态 1,第 1 行列 'a.enddatetime' 无效 在选择列表中,因为它不包含在任一聚合中 函数或 GROUP BY 子句。

【问题讨论】:

    标签: sql group-by aggregate


    【解决方案1】:

    您按month(a.enddatetime) 分组,因此在您的选择中您必须使用:

    • month(a.enddatetime)
    • 聚合函数内的字段

    你正在使用a.enddatetime,所以你有一个错误。

    在这种情况下,您可能可以改用min(a.enddatetime)

    【讨论】:

      【解决方案2】:

      http://weblogs.sqlteam.com/jeffs/archive/2007/09/10/group-by-month-sql.aspx

      GROUP BY Month(SomeDate) -- or -- GROUP BY DatePart(month, SomeDate)
      

      除非您将数据限制为仅涵盖 1 年, 它将始终涵盖 1 年,您永远不应该只分组 按日期的月份,因为它只返回一个 1-12 的数字,而不是 一个实际的“月”。因此,2006 年 1 月和 2007 年 1 月的数据将 合并为“第 1 个月”,这可能不是什么 你要。总的来说,我建议避免仅在一个月内分组 由于这些原因而编号。

      【讨论】:

        【解决方案3】:

        每当您对任何字段使用 group by 时,它都应该具有带有 select 选项的聚合函数。

        因此您可以根据选择字段的要求使用 MAX、MIN 等

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2018-08-19
          • 2012-09-09
          • 1970-01-01
          • 2022-12-29
          • 2010-09-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多