Формула Excel до SQL - PullRequest
       35

Формула Excel до SQL

0 голосов
/ 05 марта 2020

Я хотел бы добавить столбец с вычисленными значениями в мою базу данных MS SQL, но я не знаю, как создать SQL код

Мои данные содержат столбцы PricePerUnit и Instance_Type

Мне бы хотелось, чтобы в новом столбце вычисленных значений было показано, какой процент дешевле каждого Instance_Type по сравнению с самым дорогим из того же Instance_Type. Например, самый дорогой c5.12xlarge находится в первом ряду (Лондон) и поэтому дешевле на 0%, но такой же c5.12xlarge в Ирландии дешевле на 4.95%, а в Орегоне такой же Instance_Type для c5.12xlarge равен 15,84%. более дешевый. Мне бы хотелось, чтобы в столбце вычисленного значения в SQL отображалось 0% и 4,95%. 15,84% и т. Д.

В Excel я бы использовал следующее

formula =(MAXIFS(A:A,B:B,B2)-A2)/MAXIFS(A:A,B:B,B2)

Таблица базы данных называется AmazonEC2

Вот ее изображение, работающее в Excel. Первая голубая таблица идентична данным в базе данных SQL, черная таблица представляет то, чего я хочу достичь в SQL.

enter image description here

1 Ответ

0 голосов
/ 05 марта 2020

Я не думаю, что было бы хорошо (возможно, даже невозможно) сделать это как вычисляемый столбец.

Из комментариев кажется, что тип данных 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...