【问题标题】:How to use a calculated column to calculate another column in the same view如何使用计算列计算同一视图中的另一列
【发布时间】:2013-10-11 16:15:27
【问题描述】:

我希望你能帮助解决这个问题。我正在使用 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,但归根结底是某个派生数字。

【问题讨论】:

  • 有理由不做(ColumnA + ColumnB) / ColumnC As calccolumn2吗?
  • 我同意......在这个简化的例子中......这会很好。我试图了解如何格式化一个简化示例以应用于更复杂的示例......所以如果 ColumnA 是一个复杂的 Case When 语句和 ColumnB 也是......那么如果我想将它们组合成生成 calccolumn1 并稍后用于 calccolumn2。我是否只需将 A 列的整个 Case 状态放入 () 中,并将 B 列的状态相同并添加它们?
  • @AlexPoole 在同一级别上有复杂的表达式可能很方便。单一定义比在多个地方复制它更容易维护。使用CROSS APPLY approach 是可行的
  • 当然,这个问题并没有真正表现出复杂的表情。当被问到这个问题时,我想说交叉应用不可用,但是到那时 12c 已经发布了几个月,我只是不知道......虽然子查询方法也不会重复它。
  • @AlexPoole 内联视图/CTE 方法没有任何问题。我只是想表明,在同一查询级别可以有复杂的表达式作为替代。

标签: sql oracle


【解决方案1】:

您可以使用嵌套查询:

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 

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 或者你可以创建一个存储过程来输出列 calcolumn1
    • 这只是先前答案的一部分。
    【解决方案3】:

    在 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
    

    【讨论】:

      【解决方案4】:

      如果您想引用“相同查询级别”上的计算列,那么您可以使用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 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

      【讨论】:

        【解决方案5】:

        在 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 Demo

        【讨论】:

          猜你喜欢
          • 2019-11-23
          • 1970-01-01
          • 1970-01-01
          • 2019-12-25
          • 2010-12-23
          • 2021-07-15
          • 2021-09-08
          • 2018-03-07
          • 1970-01-01
          相关资源
          最近更新 更多