Sql server Excel公式到SQL

Sql server Excel公式到SQL,sql-server,excel,calculated-columns,Sql Server,Excel,Calculated Columns,我想在我的MSSQL数据库中添加一个包含计算值的列,但我不知道如何创建SQL代码 我的数据包含列PricePerUnit和Instance\u Type 我希望新的计算值列显示每个实例类型相对于同一实例类型中最昂贵的实例类型便宜多少百分比。例如,最昂贵的c5.12xlarge位于第一排(伦敦),因此便宜0%,但同样的c5.12xlarge位于爱尔兰,便宜4.95%,而在俄勒冈州,相同类型的c5.12xlarge便宜15.84%。我希望SQL中的计算值列显示0%和4.95%。15.84%左右 在E

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

我的数据包含列
PricePerUnit
Instance\u Type


我希望新的计算值列显示每个实例类型相对于同一实例类型中最昂贵的实例类型便宜多少百分比。例如,最昂贵的c5.12xlarge位于第一排(伦敦),因此便宜0%,但同样的c5.12xlarge位于爱尔兰,便宜4.95%,而在俄勒冈州,相同类型的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中实现的功能


我认为作为计算列这样做是不好的(甚至可能是不可能的)

从注释来看,PricePerUnit的数据类型似乎是nvarchar()。如果是这样的话,我必须指出这是糟糕的数据库设计。我知道这可能是你无法控制的改变

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

=CONCATENATE("insert into AmazonEC2 (PricePerUnit, Instance_Type, Instance_Family, Location) values ('", A2, "', ", "'", B2, "', '", C2, "', '", D2, "')")
我将所有这些都构建到一个应用程序中,这样您就可以看到它的实际应用,这样其他人就可以操纵数据并尝试不同的方法

下面是最后一条SQL语句,用于检索数据并计算检索时的百分比。您还可以基于此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,我将其别名为“x”。然后我从中选择并执行计算,以找到每行的百分比


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

我不了解这些数字是如何计算的。例如,爱尔兰比…便宜4.95%?什么?“但同样的c5.12xlarge是爱尔兰便宜4.95%。“我在图片中看不到与爱尔兰位置相关的c5.12xlarge。对不起,我上传图片时没有意识到图片每隔一行都会变黑,不确定那里发生了什么。我必须有一些透明度。爱尔兰的c5.12xlarge在其中一行被涂黑。这是excel中数据集的更大版本,感谢您的回复。“x”表示命令的大部分前缀是什么?x是SQL语句末尾子查询的别名(名称)。您可以随意设置(在合理的范围内)。当我运行上面的代码时,我得到了错误…“Msg 402,级别16,状态1,第6行,数据类型nvarchar和nvarchar在减法运算符中不兼容。”您的PricePerUnit列和nvarchar数据类型是吗?如果您发布了您的表定义,甚至一些示例数据供我们使用,这将非常有用。OMG太棒了!!!。刚醒来,把它放到我的SSMS里,它工作得非常好。我从你的帮助中学到了很多。我不能告诉你我有多感激你的支持。我只需要离开去学习一些东西,比如(convert)(decimal(10,2))做什么,但这就是这个练习的重点,在这个社区的帮助下教育自己。非常感谢