Группировать и агрегировать в MS SQL - PullRequest
0 голосов
/ 21 октября 2011

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.

Ответы [ 3 ]

0 голосов
/ 21 октября 2011

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 года и январь 2007 года будут быть объединены в "месяц 1", что, вероятно, не то, что ты хочешь. В целом, я рекомендую избегать группировки только на месяц номер по этим причинам.

0 голосов
/ 21 октября 2011

Всякий раз, когда вы используете group by с любым полем, оно должно иметь функцию агрегирования с опцией select.

Таким образом, вы можете использовать MAX, MIN и т. Д. Согласно требованию с полем выбора

0 голосов
/ 21 октября 2011

Вы группируете по month(a.enddatetime), поэтому при выборе необходимо использовать:

  • month(a.enddatetime) или
  • поле внутри функции агрегирования

Вы используете a.enddatetime, поэтому у вас есть ошибка.

В этом случае, вероятно, вы можете использовать min(a.enddatetime) вместо этого.

...