Как использовать вычисляемый столбец для вычисления другого столбца в том же представлении
Я надеюсь, вы можете помочь с этим вопросом. Я использую Oracle SQL (разработчик SQL для этого представления)...
Если у меня есть таблица со следующими столбцами:
- ColumnA (Номер)
- ColumnB (Номер)
- ColumnC (Количество)
на мой взгляд у меня
Select
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1
теперь на этом этапе я хочу использовать calccolumn1 но я не могу просто сказать...
Select
ColumnA,
ColumnB,
ColumnA + ColumnB As calccolumn1
calccolumn1 / ColumnC as calccolumn2
Я предполагаю, что мне нужен какой-то тип подзапрос..но здесь мне нужна твоя помощь... Как бы я сформулировал запрос, чтобы я мог использовать calccolumn1 в другом вычислении в том же запросе? Это может быть If тогда или случай, когда, но bottomline это некоторое производное число.
4 ответов
вы можете использовать вложенный запрос:
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
вы должны включить выражение для вычисляемого столбца:
SELECT
ColumnA,
ColumnB,
ColumnA + ColumnB AS calccolumn1
(ColumnA + ColumnB) / ColumnC AS calccolumn2
В 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
если вы хотите ссылаться на вычисляемый столбец на "том же уровне запроса", то вы можете использовать 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;
обратите внимание, что выражение 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 ...;
этот подход позволяет избежать обертывания всего запроса внешним запросом или копирования / вставки одного и того же выражения в нескольких местах(со сложным может быть трудно поддерживать).