如何使用计算列在同一视图中计算另一列


76

我希望您能为这个问题提供帮助。我正在使用Oracle SQL(此视图为SQL Developer)...

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

  • 列A(数字)
  • ColumnB(编号)
  • ColumnC(编号)

我认为我有

Select  
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1

现在,我要使用calccolumn1,但我不能只说...

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

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


1
有理由不做(ColumnA + ColumnB) / ColumnC As calccolumn2吗?
亚历克斯·普尔

4
我同意...在这个简化的示例中。我试图了解如何格式化简化示例以应用于更复杂的示例的概念...因此,如果ColumnA是一个复杂的Case While语句,而ColumnB也...那么如果我想将它们组合为产生calccolumn1,然后再用于calccolumn2。我是否只是将列A的整个Case状态放在()中,并将B的整个Case状态添加到它们中并添加它们?
Ewaver 2013年

1
@AlexPoole在同一级别上具有复杂的表达可能会很方便。单一定义比在多个位置复制它更容易维护。它可以使用CROSS APPLY approach
Lukasz Szozda 18'Aug

当然,这个问题并没有真正显示出复杂的表达。我要说的是,当问到这个问题时交叉应用是不可用的,但是那时12c已经出几个月了,我只是不知道...子查询方法也没有重复。
亚历克斯·普尔

@AlexPoole内联视图/ CTE方法没有任何问题。我只是想表明,可以在与替代项相同的查询级别上具有复杂的表达式。
Lukasz Szozda

Answers:


51

您可以使用嵌套查询:

Select
  ColumnA,
  ColumnB,
  calccolumn1,
  calccolumn1 / ColumnC as calccolumn2
From (
  Select
    ColumnA,
    ColumnB,
    ColumnC,
    ColumnA + ColumnB As calccolumn1
  from t42
);

与值的行345给出:

   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 

17

在Sql Server中

您可以使用 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

12

如果要在“相同查询级别”上引用计算列,则可以使用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 ...;

这种方法可以避免用outerquery包裹整个查询,或者避免将相同的表达式复制/粘贴到多个地方(复杂的地方很难维护)。

相关文章:SQL语言最缺少的功能


7

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

SELECT  
ColumnA,  
ColumnB,  
ColumnA + ColumnB AS calccolumn1  
(ColumnA + ColumnB) / ColumnC AS calccolumn2

或者你可以创建一个存储过程来输出列calcolumn1
swirlingsara

这只是先前答案的一部分。
Mark Schultheiss,

0

在SQL Server中,

可以使用With CTE

使用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演示

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.