Excel 公式 SQL

Excel formula to SQL

我想向我的 MSSQL 数据库添加一个包含计算值的列,但我不知道如何创建 SQL 代码

我的数据包含 PricePerUnitInstance_Type

我希望新的计算值列显示每个 Instance_Type 相对于同一个 Instance_Type 中最便宜的百分比。例如,最昂贵的 c5.12xlarge 在第一行(伦敦),因此便宜 0%,但同样的 c5.12xlarge 在爱尔兰便宜 4.95%,在俄勒冈州与 c5 相同 Instance_Type。 12xlarge 便宜 15.84%。我希望 SQL 中的计算值列显示 0% 和 4.95%。 15.84%等等。

在Excel中我会使用下面的

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

数据库 table 名为 AmazonEC2

这是它在 Excel 中工作的图像。第一个蓝色table与SQL数据库中的数据相同,黑色table代表我在SQL.

中想要实现的

我认为将其作为计算列来执行并不好(甚至可能不可能)。

从评论来看,PricePerUnit 的数据类型似乎是nvarchar()。如果是这样,我必须指出这是糟糕的数据库设计。我知道这可能超出了您的控制范围。

无论如何,我创建了一个 AmazonEC2 table,因为我认为您可能拥有它。使用您的数据电子表格,我创建了插入语句以使用以下公式用您的数据填充 table。

=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;

我们在这里做的是为子查询中的每个 Instance_Type 获取最大 PricePerUnit,我将其别名为 "x"。然后我从中 select 并执行计算以找到每行的 PercentCheaper。

由于 PricePerUnit 似乎是 nvarchar() 列,您需要将其转换为数字才能进行计算。请注意,您不需要转换 MaxPricePerUnit,因为转换发生在它被用作 MAX() 函数的输入之前,导致输出具有 decimal(10,2) 数据类型。