如何使用计算列来计算同一视图中的另一列
如何使用计算列来计算同一视图中的另一列
希望你能帮助解答这个问题。我使用的是Oracle SQL(SQL Developer)...\n如果我有一个包含以下列的表:\n
- \n
- ColumnA(数字)
- ColumnB(数字)
- ColumnC(数字)
\n
\n
\n
\n在我的视图中,我有:\n
Select ColumnA, ColumnB, ColumnA + ColumnB作为calccolumn1
\n现在,我想在这一点上使用calccolumn1,但我不能简单地说...\n
Select ColumnA, ColumnB, ColumnA + ColumnB作为calccolumn1, calccolumn1 / ColumnC作为calccolumn2
\n我假设我需要一些子查询..但这就是我需要你的帮助的地方...\n我应该如何编写查询,以便在同一查询中使用calccolumn1进行另一个计算?可能是一个If then或一个Case when,但底线是一些派生数字。
如何使用计算列来计算同一视图中的另一列
在同一查询级别中引用计算列时,可以使用CROSS APPLY(Oracle 12c)来实现。
示例数据:
CREATE TABLE tab(ColumnA NUMBER(10,2),ColumnB NUMBER(10,2),ColumnC NUMBER(10,2));
INSERT INTO tab(ColumnA, ColumnB, ColumnC) VALUES (2, 10, 2);
INSERT INTO tab(ColumnA, ColumnB, ColumnC) VALUES (3, 15, 6);
INSERT INTO tab(ColumnA, ColumnB, ColumnC) VALUES (7, 14, 3);
COMMIT;
查询:
SELECT
ColumnA,
ColumnB,
sub.calccolumn1,
sub.calccolumn1 / ColumnC AS calccolumn2
FROM tab t
CROSS APPLY (SELECT t.ColumnA + t.ColumnB AS calccolumn1 FROM dual) sub;
DBFiddle Demo
请注意,CROSS APPLY / OUTER APPLY 中的表达式也可用于其他子句:
SELECT
ColumnA,
ColumnB,
sub.calccolumn1,
sub.calccolumn1 / ColumnC AS calccolumn2
FROM tab t
CROSS APPLY (SELECT t.ColumnA + t.ColumnB AS calccolumn1 FROM dual) sub
WHERE sub.calccolumn1 = 12;
-- GROUP BY ...
-- ORDER BY ...;
这种方法可以避免将整个查询包装在外部查询中,或者在多个位置复制/粘贴相同的表达式(对于复杂的表达式,这可能很难维护)。
相关文章: The SQL Language’s Most Missing Feature
在Sql Server中,可以使用cross apply来实现这一目的。通过在查询语句中使用cross apply,可以在同一个视图中使用一个已计算的列来计算另一个列。
具体实现方法如下:
Select ColumnA, ColumnB, c.calccolumn1 As calccolumn1, c.calccolumn1 / ColumnC As calccolumn2 from t42 cross apply (select (ColumnA + ColumnB) as calccolumn1) as c
在上述代码中,首先选取了ColumnA和ColumnB两个列作为结果集的一部分。然后,通过使用cross apply,创建了一个临时表c,其中包含了一个已计算的列calccolumn1,该列的值是ColumnA和ColumnB的相加结果。最后,通过将calccolumn1除以ColumnC,计算出了另一个列calccolumn2的值。
通过这种方法,我们可以在同一个查询中使用已计算的列来计算其他列的值,从而简化了查询的过程。
使用计算列来计算同一视图中的另一列的方法
在某些情况下,我们需要使用一个已经计算出来的列来计算同一视图中的另一列。下面是一种解决方法:
方法一:使用嵌套查询
Select ColumnA, ColumnB, calccolumn1, calccolumn1 / ColumnC as calccolumn2 From ( Select ColumnA, ColumnB, ColumnC, ColumnA + ColumnB As calccolumn1 from t42 );
对于一行值为3,4,5的数据,将得到如下结果:
COLUMNA COLUMNB CALCCOLUMN1 CALCCOLUMN2 ---------- ---------- ----------- ----------- 3 4 7 1.4
方法二:重复第一个计算,除非这个计算非常耗费资源(比如函数调用)。
Select ColumnA, ColumnB, ColumnA + ColumnB As calccolumn1, (ColumnA + ColumnB) / ColumnC As calccolumn2 from t42;
对于同样的一行数据,将得到相同的结果:
COLUMNA COLUMNB CALCCOLUMN1 CALCCOLUMN2 ---------- ---------- ----------- ----------- 3 4 7 1.4
以上就是使用计算列来计算同一视图中的另一列的解决方法。