Установить результат AVG как столбец - PullRequest
2 голосов
/ 13 июля 2011

Я выполняю запрос в SQL Server 2005. В запросе должен быть столбец, который состоит из одного и того же числа весь путь вниз.Число является средним числом другой строки в запросе.Вот что у меня есть, может быть, это поможет понять, что я пытаюсь сделать.Эти данные имеют значения «color» и «DataExtraLineValue» одинаковые весь путь вниз, потому что программное обеспечение, которое читает этот запрос, выплевывает диаграмму.В основном, почему я не могу запустить AVG (TagValueInteger) AS DataExtraLineValue

SELECT
      RecordedDateTime AS DataGroup,
      TagValueInteger AS DataBar,
      TagValueInteger AS DataLine,
      'Green' AS DataColor,
      'Avg' AS DataExtraLineLabel,
       AVG(TagValueInteger) AS DataExtraLineValue,
      'Blue' AS DataExtraLineColor
FROM tTagHistory
WHERE
      (TagHistoryDefinitionID = 2) AND
      (IsQualityGood = 1) AND
      (DeltaValueInteger <> 0) AND
      (TagValue > 4) AND
      (TagValue < 60) AND 
      (RecordedDateTime > (GetDate()-2))
ORDER BY RecordedDateTime DESC

Ответы [ 3 ]

4 голосов
/ 13 июля 2011

Вы не можете сделать это, потому что нет группировки.Без группировки ваш AVG будет значением для каждой строки.Если вы хотите получить среднее значение для ВСЕХ значений этого поля для всей таблицы, вы можете сделать это подзапросом:

SELECT ....
       (SELECT AVG(TagValueInteger) FROM tTagHistory) as DataExtraLineValue
       ....
1 голос
/ 13 июля 2011

AVG - агрегатная функция.Использование агрегатных функций подразумевает группирование.Вы агрегируете значения во всем наборе строк или в группах.В первом случае у вас не может быть неагрегированных столбцов (кроме статических значений, таких как ваши 'Green', 'Avg'), а во втором случае вы должны ввести предложение GROUP BY, где вы должны перечислить все столбцы, которыеопределить группы: они будут не агрегированы в списке SELECT.Поскольку у вашего запроса есть некоторые неагрегированные значения, это, скорее всего, второй случай, и ваш запрос должен выглядеть примерно так:

SELECT
      RecordedDateTime AS DataGroup,
      TagValueInteger AS DataBar,
      TagValueInteger AS DataLine,
      'Green' AS DataColor,
      'Avg' AS DataExtraLineLabel,
       AVG(TagValueInteger) AS DataExtraLineValue,
      'Blue' AS DataExtraLineColor
FROM tTagHistory
WHERE
      (TagHistoryDefinitionID = 2) AND
      (IsQualityGood = 1) AND
      (DeltaValueInteger <> 0) AND
      (TagValue > 4) AND
      (TagValue < 60) AND 
      (RecordedDateTime > (GetDate()-2))
<b>GROUP BY RecordedDateTime, TagValueInteger</b>
ORDER BY RecordedDateTime DESC

Однако, что касается вашего поста, еще более вероятно, что выхотите получить как агрегированные, так и неагрегированные значения.В этом случае вам нужна оконная агрегация.Агрегированная функция становится агрегированной оконной функцией, если добавить к ней OVER условие .В вашем конкретном случае это, вероятно, должно выглядеть следующим образом:

SELECT
      RecordedDateTime AS DataGroup,
      TagValueInteger AS DataBar,
      TagValueInteger AS DataLine,
      'Green' AS DataColor,
      'Avg' AS DataExtraLineLabel,
       AVG(TagValueInteger) <b>OVER ()</b> AS DataExtraLineValue,
      'Blue' AS DataExtraLineColor
FROM tTagHistory
WHERE
      (TagHistoryDefinitionID = 2) AND
      (IsQualityGood = 1) AND
      (DeltaValueInteger <> 0) AND
      (TagValue > 4) AND
      (TagValue < 60) AND 
      (RecordedDateTime > (GetDate()-2))
ORDER BY RecordedDateTime DESC

AVG(TagValueInteger) OVER () возвращает среднее значение TagValueInteger для всего набора строк.В качестве альтернативы вы можете изменить предложение OVER (), чтобы оно возвращало разные (возможно, повторяющиеся) значения для разных групп, например, `AVG(TagValueInteger) OVER (PARTITION BY DataGroup) будет возвращать разные средние значения, каждое для разных значений DataGroup.Подробнее об этом вы можете прочитать в связанной статье.

1 голос
/ 13 июля 2011

Еще один способ сделать это так:

SELECT 
  ....    
  AVG(TagValueInteger) over () AS DataExtraLineValue
  ....
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...