sql-server - Excel 公式转 SQL
问题描述
我想在我的 MSSQL 数据库中添加一个包含计算值的列,但我不知道如何创建 SQL 代码
我的数据包含列PricePerUnit
和Instance_Type
我希望新的计算值列显示每个 Instance_Type 与同一 Instance_Type 中最昂贵的百分比相比便宜多少。例如,最昂贵的 c5.12xlarge 位于第一行(伦敦),因此便宜 0%,但相同的 c5.12xlarge 是爱尔兰便宜 4.95%,而在俄勒冈州,相同的 c5.12xlarge Instance_Type 为 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 表,因为我认为您可能拥有它。使用您的数据电子表格,我创建了插入语句,使用以下公式用您的数据填充该表。
=CONCATENATE("insert into AmazonEC2 (PricePerUnit, Instance_Type, Instance_Family, Location) values ('", A2, "', ", "'", B2, "', '", C2, "', '", D2, "')")
我将所有这些都构建到了一个dbfiddle中,这样您就可以看到它的运行情况,这样这里的其他人就可以操纵数据并尝试不同的方法。
这是检索数据并在检索时计算 PercentCheaper 的最终 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;
我们在这里所做的是获取子查询中每个 Instance_Type 的最大 PricePerUnit,我将其别名为“x”。然后我从中选择并执行计算以找到每行的 PercentCheaper。
由于 PricePerUnit 似乎是一个 nvarchar() 列,因此您需要将其转换为数字才能进行计算。请注意,您不需要转换 MaxPricePerUnit,因为转换发生在它被用作 MAX() 函数的输入之前,导致输出具有 decimal(10,2) 数据类型。
推荐阅读
- java - 使用单线程 ForkJoinPool 在 Future 中运行 Future.map
- node.js - 如何使用 jest 多次运行相同的测试
- javascript - 仅通过工具栏编辑文本
- generics - Rust 中的谓词是什么?
- arrays - Angular/Typescript 更改数字数组的值
- r - 如何仅打印数据框的索引
- python - Docker没有将输出保存到文件
- python - Python:plt.plot(x,y)ValueError:格式字符串中无法识别的字符S
- python - Python - 脚本从 JSON 中读取一个值并在 CSV 中写入 200 次
- javascript - 用打开的选项卡上的按钮关闭选项卡的方法是什么?