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
)

我需要计算

  1. 以欧元表示的买卖价格(乘以 2 列);
  2. 然后取之前的值并计算差值(利润)
  3. 最后取差值和计算出的买入价值,计算利润%

假设这需要参考计算值来计算下一个值

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