Я не думаю, что было бы хорошо (возможно, даже невозможно) сделать это как вычисляемый столбец.
Из комментариев кажется, что тип данных PricePerUnit - nvarchar (). Если это так, я должен указать, что плохой дизайн базы данных. Я понимаю, что это может не зависеть от вас.
В любом случае, я создал таблицу AmazonEC2, так как думаю, что она у вас есть. Используя электронную таблицу данных, я создал операторы вставки, чтобы заполнить эту таблицу данными, используя следующую формулу:
=CONCATENATE("insert into AmazonEC2 (PricePerUnit, Instance_Type, Instance_Family, Location) values ('", A2, "', ", "'", B2, "', '", C2, "', '", D2, "')")
Я встроил все это в dbfiddle , чтобы вы могли увидеть его в действие и так, чтобы другие люди здесь могли манипулировать данными и пробовать разные подходы.
Вот окончательный оператор SQL для извлечения ваших данных и вычисления PercentCheaper во время извлечения. Вы также можете создать представление на основе этого оператора SQL.
SELECT
x.PricePerUnit
, x.Instance_Type
, x.Instance_Family
, x.Location
, FORMAT((x.MaxPricePerUnit - convert(decimal(10, 2), PricePerUnit)) / x.MaxPricePerUnit, 'P') AS PercentCheaper
FROM (
SELECT
PricePerUnit
, Instance_Type
, Instance_Family
, Location
, MAX(convert(decimal(10, 2), PricePerUnit)) OVER (PARTITION BY Instance_Type) AS MaxPricePerUnit
FROM AmazonEC2
) x;
Здесь мы получаем максимальный PricePerUnit для каждого Instance_Type в подзапросе, который я назвал псевдонимом "x". Затем я выбираю из этого и выполняю вычисление, чтобы найти PercentCheaper для каждой строки.
Поскольку кажется, что PricePerUnit - это столбец nvarchar (), вам необходимо преобразовать его в число, чтобы выполнить вычисления. Обратите внимание, что вам не нужно преобразовывать MaxPricePerUnit, поскольку преобразование произошло до того, как оно использовалось в качестве входных данных для функции MAX (), что привело к выходу с типом данных decimal (10,2).