92

我希望你能帮助解决这个问题。我正在使用 Oracle SQL(此视图的 SQL Developer)...

如果我有一个包含以下列的表格:

  • A 列(编号)
  • B 列(编号)
  • C 列(编号)

在我看来我有

Select  
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1

现在在这一点上,我想使用 calccolumn1 但我不能只说......

Select  
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1
calccolumn1 / ColumnC as calccolumn2

我假设我需要某种类型的子查询..但这是我需要你帮助的地方...我将如何措辞查询,以便我可以在同一查询中的另一个计算中使用 calccolumn1?它可能是 If then 或 Case when,但最重要的是它是某个派生数字。

4

5 回答 5

63

您可以使用嵌套查询:

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 
于 2013-10-04T15:42:42.863 回答
26

在 Sql 服务器中

您可以使用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
于 2017-03-29T07:01:53.353 回答
14

如果您想在“相同查询级别”上引用计算列,那么您可以使用CROSS APPLY(Oracle 12c):

--Sample data:
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 演示


请注意,表达式 fromCROSS 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 ...;

这种方法可以避免使用外部查询包装整个查询或在多个位置复制/粘贴相同的表达式(复杂的表达式可能难以维护)。

相关文章:SQL 语言最缺失的特性

于 2018-08-26T07:18:28.663 回答
8

您必须包含计算列的表达式:

SELECT  
ColumnA,  
ColumnB,  
ColumnA + ColumnB AS calccolumn1  
(ColumnA + ColumnB) / ColumnC AS calccolumn2
于 2014-02-12T02:58:10.340 回答
3

在 SQL Server

中,您可以使用With CTE执行此操作

WITH common_table_expression (Transact-SQL)

CREATE TABLE tab(ColumnA DECIMAL(10,2), ColumnB DECIMAL(10,2), ColumnC DECIMAL(10,2))

INSERT INTO tab(ColumnA, ColumnB, ColumnC) VALUES (2, 10, 2),(3, 15, 6),(7, 14, 3)

WITH tab_CTE (ColumnA, ColumnB, ColumnC,calccolumn1)  
AS  
(  
Select
    ColumnA,
    ColumnB,
    ColumnC,
    ColumnA + ColumnB As calccolumn1
  from tab
)  

SELECT
  ColumnA,
  ColumnB,
  calccolumn1,
  calccolumn1 / ColumnC AS calccolumn2
FROM  tab_CTE

DBFiddle 演示

于 2020-04-04T17:26:37.057 回答