SQL SELECT 中的嵌套计算
Nested calculations in SQL SELECT
我有一个 SQLite table,其中包含不同货币的买卖价格。像
CREATE TABLE ins_and_outs
(
prod_id INTEGER NOT NULL,
buy_price DECIMAL,
buy_currency TEXT,
buy_currency_EUR DECIMAL NOT NULL,
sell_price DECIMAL,
sell_currency TEXT,
sell_currency_EUR DECIMAL
)
我需要计算
- 以欧元表示的买卖价格(乘以 2 列);
- 然后取之前的值并计算差值(利润)
- 最后取差值和计算出的买入价值,计算利润%
假设这需要参考计算值来计算下一个值
SELECT buy_price * buy_currency_EUR AS buy_Eur, sell_price * sell_currency_EUR AS sell_Eur, sell_Eur - buy_Eur AS profit, profit / buy_Eur * 100 AS pct
只有这个不被接受,如果我能找到更好的解决方案,我不想在每一列中重复计算。
这当然可以很容易地完成,将 SQL 输出分配给外部数组或对象,但我一直在研究使用一个或多个视图在数据库中做所有事情。
我看过使用 sub-queries,但我需要从子查询中与主查询相同的 table 行中获取值,但我不知道该怎么做要做到这一点,假设我发现的所有示例都使用固定值或来自子查询中其他 table 的值。我还认为使用子查询的解决方案会使 SQL 语句在将来很难阅读和排除故障。
一种替代方法是创建 2 个视图,第一个视图以欧元计算售价,第二个视图将第一个视图作为输入并计算其余视图。这行得通吗?此外,嵌套视图能否一直更新回原始 tables?
另一种方法是将计算列添加到 table 并触发 UPDATE
上的计算。这将使用更多磁盘 space 但每次访问数据时需要更少 CPU。
最重要的是,这个案例的最佳解决方案是什么?
因此,正如您查询的 SELECT
语句部分的注释中所述,您不能重复使用您在此处定义的别名:
SELECT buy_price * buy_currency_EUR AS buy_Eur, -- buy_Eur is an alias not a column
sell_price * sell_currency_EUR AS sell_Eur -- same here,
sell_Eur - buy_Eur AS profit,
profit / buy_Eur * 100 AS pct
FROM yourTable
因此,为了解决您的问题,最简单的方法是重复计算并确保使用括号:
SELECT buy_price * buy_currency_EUR AS buy_Eur,
sell_price * sell_currency_EUR AS sell_Eur,
(sell_price * sell_currency_EUR) - (buy_price * buy_currency_EUR) AS profit,
(((sell_price * sell_currency_EUR) - (buy_price * buy_currency_EUR)) / (buy_price * buy_currency_EUR) * 100) AS pct
FROM yourTable
另一种方法是使用子查询,但您需要多个子查询,恕我直言(我将只显示一个级别):
SELECT buy_Eur, sell_Eur,
sell_Eur - buy_Eur as profit,
(sell_Eur - buy_Eur) / buy_Eur * 100 as pct
FROM (
SELECT buy_price * buy_currency_EUR AS buy_Eur,
sell_price * sell_currency_EUR AS sell_Eur
FROM yourTable
) as sub -- you need to name (alias) your subquery
编辑:
另一种选择是创建查询视图并像简单的 table:
一样查询它
CREATE VIEW yourViewName as
SELECT buy_price * buy_currency_EUR AS buy_Eur,
sell_price * sell_currency_EUR AS sell_Eur,
(sell_price * sell_currency_EUR) - (buy_price * buy_currency_EUR) AS profit,
(((sell_price * sell_currency_EUR) - (buy_price * buy_currency_EUR)) / (buy_price * buy_currency_EUR) * 100) AS pct
FROM yourTable;
然后只需使用:
select buy_Eur, sell_Eur, profit, pct
from yourViewName
我有一个 SQLite table,其中包含不同货币的买卖价格。像
CREATE TABLE ins_and_outs
(
prod_id INTEGER NOT NULL,
buy_price DECIMAL,
buy_currency TEXT,
buy_currency_EUR DECIMAL NOT NULL,
sell_price DECIMAL,
sell_currency TEXT,
sell_currency_EUR DECIMAL
)
我需要计算
- 以欧元表示的买卖价格(乘以 2 列);
- 然后取之前的值并计算差值(利润)
- 最后取差值和计算出的买入价值,计算利润%
假设这需要参考计算值来计算下一个值
SELECT buy_price * buy_currency_EUR AS buy_Eur, sell_price * sell_currency_EUR AS sell_Eur, sell_Eur - buy_Eur AS profit, profit / buy_Eur * 100 AS pct
只有这个不被接受,如果我能找到更好的解决方案,我不想在每一列中重复计算。
这当然可以很容易地完成,将 SQL 输出分配给外部数组或对象,但我一直在研究使用一个或多个视图在数据库中做所有事情。
我看过使用 sub-queries,但我需要从子查询中与主查询相同的 table 行中获取值,但我不知道该怎么做要做到这一点,假设我发现的所有示例都使用固定值或来自子查询中其他 table 的值。我还认为使用子查询的解决方案会使 SQL 语句在将来很难阅读和排除故障。
一种替代方法是创建 2 个视图,第一个视图以欧元计算售价,第二个视图将第一个视图作为输入并计算其余视图。这行得通吗?此外,嵌套视图能否一直更新回原始 tables?
另一种方法是将计算列添加到 table 并触发 UPDATE
上的计算。这将使用更多磁盘 space 但每次访问数据时需要更少 CPU。
最重要的是,这个案例的最佳解决方案是什么?
因此,正如您查询的 SELECT
语句部分的注释中所述,您不能重复使用您在此处定义的别名:
SELECT buy_price * buy_currency_EUR AS buy_Eur, -- buy_Eur is an alias not a column
sell_price * sell_currency_EUR AS sell_Eur -- same here,
sell_Eur - buy_Eur AS profit,
profit / buy_Eur * 100 AS pct
FROM yourTable
因此,为了解决您的问题,最简单的方法是重复计算并确保使用括号:
SELECT buy_price * buy_currency_EUR AS buy_Eur,
sell_price * sell_currency_EUR AS sell_Eur,
(sell_price * sell_currency_EUR) - (buy_price * buy_currency_EUR) AS profit,
(((sell_price * sell_currency_EUR) - (buy_price * buy_currency_EUR)) / (buy_price * buy_currency_EUR) * 100) AS pct
FROM yourTable
另一种方法是使用子查询,但您需要多个子查询,恕我直言(我将只显示一个级别):
SELECT buy_Eur, sell_Eur,
sell_Eur - buy_Eur as profit,
(sell_Eur - buy_Eur) / buy_Eur * 100 as pct
FROM (
SELECT buy_price * buy_currency_EUR AS buy_Eur,
sell_price * sell_currency_EUR AS sell_Eur
FROM yourTable
) as sub -- you need to name (alias) your subquery
编辑: 另一种选择是创建查询视图并像简单的 table:
一样查询它CREATE VIEW yourViewName as
SELECT buy_price * buy_currency_EUR AS buy_Eur,
sell_price * sell_currency_EUR AS sell_Eur,
(sell_price * sell_currency_EUR) - (buy_price * buy_currency_EUR) AS profit,
(((sell_price * sell_currency_EUR) - (buy_price * buy_currency_EUR)) / (buy_price * buy_currency_EUR) * 100) AS pct
FROM yourTable;
然后只需使用:
select buy_Eur, sell_Eur, profit, pct
from yourViewName