#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