Подтвердить что ты не робот

Как использовать вычисляемый столбец для вычисления другого столбца в одном представлении

Я надеюсь, что вы сможете помочь в этом вопросе. Я использую Oracle SQL (SQL Developer для этого представления)...

Если у меня есть таблица со следующими столбцами:

  • ColumnA (Number)
  • ColumnB (Number)
  • ColumnC (Number)

На мой взгляд, у меня

Select  
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1

Теперь, в этот момент, я хочу использовать calccolumn1 но я не могу просто сказать...

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

Я предполагаю, что мне нужен какой-то подзапрос... но здесь мне нужна ваша помощь... Как я могу сложить запрос, чтобы я мог использовать calccolumn1 в другом вычислении в рамках одного и того же запроса? Это может быть If If или Case, когда, но нижняя линия - это некоторое производное число.

4b9b3361

Ответ 1

Вы можете использовать вложенный запрос:

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 

Ответ 2

В 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

Ответ 3

Вы должны включить выражение для вычисленного столбца:

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

Ответ 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 ...;

Такой подход позволяет избежать наложения всего запроса на внешний запрос или копирования/вставки одного и того же выражения в нескольких местах (в случае со сложным оно может быть сложно поддерживать).

Связанная статья: наиболее недостающая особенность языков SQL