Применение бизнес-логики в инструкции SELECT для одного поля

#sql #sql-server #tsql

#sql #sql-сервер #tsql

Вопрос:

У меня есть табличная переменная в моей хранимой процедуре, которая при выполнении дает следующий результат

 SELECT * FROM @TableVariable

  Team  | Score | Change
  Team1    213      46
  Team2    244      51
  Team1    345      48
  Team2    256      45
  Team3    346      75
 

Моя хранимая процедура при выполнении должна выдавать результат в приведенном ниже формате.

 SELECT T.[TeamName] as 'TeamName', @ScoreChange AS 'ScoreMetric', '' AS 'SeriesMetric'
FROM  dbo.[Team] T WHERE T.[OwnerId] = @OwnerId

 TeamName  | ScoreMetric | SeriesMetric
     Team1        34   
     Team2        34 
     Team3        34
 

Проблема, с которой я сталкиваюсь, связана с вычислением SeriesMetric , потому что при вычислении используется SeriesMetric вычисление, и мне нужно встроить эту логику вычисления в приведенный ниже запрос select, который используется в моей сохраненной процедуре

 SELECT T.[TeamName] as 'TeamName', @ScoreChange AS 'ScoreMetric', '' AS 'SeriesMetric'
FROM  dbo.[Team] T WHERE T.[OwnerId] = @OwnerId
 

Ниже приведена логика, используемая для вычисления «SeriesMetric», которая должна быть встроена в приведенный выше запрос select

Мне нужно сгруппировать все команды в моей табличной переменной @TableVariable и рассчитать среднее значение (изменение) по команде

Каждая команда будет иметь значение ChangeAverage

     Team     | ChangeAverage
    Team1          47
    Team2          48
    Team3          75
 

‘SeriesMetric’ для каждой команды будет ChangeAverage*100 / 25

Ответ №1:

вы можете добиться этого с помощью оконных функций и разбиения i

 SELECT 
 *
, AVG(Change) over (parition by Team) as  ChangeAverage
, (AVG(Change) over (parition by Team)) * 4 as SeriesMetric
FROM @TableVariable
 

Но если вы хотите использовать его в сочетании с другой таблицей, чтобы показать конечный результат, вот что вам нужно сделать :

 SELECT T.[TeamName] as 'TeamName'
, @ScoreChange AS 'ScoreMetric'
, AVG(TV.Change)* 4 AS 'SeriesMetric'
FROM  dbo.[Team] T 
LEFT JOIN @TableVariable TV
 on T.TeamName = TV.TeamName -- or whatever FK-PK is 

WHERE T.[OwnerId] = @OwnerId
GROUP BY 
T.NAME ,ScoreMetric