Як використовувати обчислюваний стовпець для обчислення іншого стовпця в тому ж поданні


78

Сподіваюся, ви можете допомогти з цим питанням. Я використовую 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, але в підсумку це деяке похідне число.


1
Чи є причина не просто робити (ColumnA + ColumnB) / ColumnC As calccolumn2?
Alex Poole,

5
Я погоджуюсь ... у цьому спрощеному прикладі .. це було б добре. Я намагався дійти до концепції, як відформатувати спрощений приклад, щоб застосувати його до більш складного ... тож, якщо ColumnA був складним Case Case, коли оператор та ColumnB також були ... то, якщо я хочу об'єднати їх до виробляють calccolumn1 і пізніше використовують для calccolumn2. Чи міг би я просто поставити весь стан справи для стовпця A у () і те саме для B і додати їх?
Ewaver

1
@AlexPoole Наявність складних виразів на одному рівні може бути корисною. Єдине визначення легше підтримувати, ніж копіювати його в декількох місцях. Це здійсненно, використовуючиCROSS APPLY approach
Лукаш Шозда

Звичайно, питання просто не відображало складного виразу насправді. Я збирався сказати, що перехресне застосування було недоступне, коли було задано питання, але 12c до цього часу вийшов кілька місяців, я просто не знав про це ... Однак підхід до підзапитів не повторює цього.
Alex Poole

@AlexPoole У вбудованому поданні / підході CTE немає нічого поганого. Я просто хотів показати, що можна мати складний вираз на тому ж рівні запиту, що й альтернативний.
Лукаш Шозда

Відповіді:


54

Ви можете використовувати вкладений запит:

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 

18

На сервері SQL

Ви можете зробити це за допомогою 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


Зверніть увагу, що вираз від 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


7

Ви повинні включити вираз для розрахункового стовпця:

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

Або ви можете створити збережену процедуру для виведення стовпця calcolumn1
swirlingsara

Це лише копія частини попередньої відповіді.
Марк

0

У SQL Server

Ви можете зробити це за допомогою програми CTE

З загальним_вираженням_таблиці (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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.