Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何使用计算列计算同一视图中的另一列_Sql_Oracle - Fatal编程技术网

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

Sql 如何使用计算列计算同一视图中的另一列,sql,oracle,Sql,Oracle,我希望你能帮我解决这个问题。我正在使用Oracle SQL(此视图的SQL开发人员) 如果我有一个包含以下列的表: A栏(编号) B栏(编号) C列(编号) 在我看来,我有 Select ColumnA, ColumnB, ColumnA + ColumnB As calccolumn1 现在,我想使用calccolumn1 但我不能只说 Select ColumnA, ColumnB, ColumnA + ColumnB As calccolumn1 calccolumn1 /

我希望你能帮我解决这个问题。我正在使用Oracle SQL(此视图的SQL开发人员)

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

  • 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,但底线是某个派生的数字。

您可以使用嵌套查询:

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

Sql Server中的

您可以使用
交叉应用

Select
  ColumnA,
  ColumnB,
  c.calccolumn1 As calccolumn1,
  c.calccolumn1 / ColumnC As calccolumn2
from t42
cross apply (select (ColumnA + ColumnB) as calccolumn1) as c

如果要引用“同一查询级别”上的计算列,则可以使用
交叉应用
(Oracle 12c):

查询:

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;


请注意,
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 ...;
这种方法可以避免使用outerquery包装整个查询,或者在多个位置复制/粘贴相同的表达式(使用复杂的表达式可能很难维护)


相关文章:

在SQL Server中

您可以使用带有CTE的来执行此操作


有没有理由不把
(ColumnA+ColumnB)/ColumnC作为calccolumn2
?我同意……在这个简化的例子中……这样就行了。我试图了解如何格式化一个简化的示例以应用于更复杂的示例…因此,如果ColumnA是一个复杂的案例,而语句和ColumnB也是…那么如果我想将它们组合起来生成calccolumn1,然后用于calccolumn2。我是否可以简单地将A列的整个Case状态放在()中,B列的整个Case状态也放在()中并添加它们?@AlexPoole在同一级别上拥有复杂的表达式可能会很方便。单个定义比在多个位置复制它更容易维护。这是可行的使用当然,问题只是没有显示出一个复杂的表达真的。我想说,当问到这个问题时,cross apply是不可用的,但到那时12c已经推出几个月了,我只是不知道。。。尽管如此,子查询方法也没有重复。@AlexPoole内联视图/CTE方法没有任何错误。我只是想说明,可以在与alternative相同的查询级别上使用复杂表达式。或者您可以创建一个存储过程来输出列CalColumn1。这只是先前答案的一部分的副本。
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;
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 ...;
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