26

lets say I have a huge select on a certain table. One value for a column is calculated with complex logc and its called ColumnA. Now, for another column, I need the value from ColumnA and add some other static value to it.

Sample SQL:

select table.id, table.number, complex stuff [ColumnA], [ColumnA] + 10 .. from table ...

The [ColumnA] + 10 is what im looking for. The complex stuff is a huge case/when block.

Ideas?

grady
  • 12,281
  • 28
  • 71
  • 110

5 Answers5

30

If you want to reference a value that's computed in the SELECT clause, you need to move the existing query into a sub-SELECT:

SELECT
    /* Other columns */,
    ColumnA,
    ColumnA + 10 as ColumnB
FROM
(select table.id, table.number, complex stuff [ColumnA].. from table ...
) t

You have to introduce an alias for this table (in the above, t, after the closing bracket) even if you're not going to use it.

(Equivalently - assuming you're using SQL Server 2005 or later - you can move your existing query into a CTE):

;WITH PartialResults as (
     select table.id, table.number, complex stuff [ColumnA].. from table ...
)
SELECT /* other columns */, ColumnA, ColumnA+10 as ColumnB from PartialResults

CTEs tend to look cleaner if you've got multiple levels of partial computations being done, I.e. if you've now got a calculation that depends on ColumnB to include in your query.

Damien_The_Unbeliever
  • 234,701
  • 27
  • 340
  • 448
2

Unfortunately, in SQL Server 2016:

SELECT 3 AS a, 6/a AS b;

Error: Invalid column name: 'a'.

Ludovic Aubert
  • 9,534
  • 4
  • 16
  • 28
1

You could solve this with a subquery and column aliases.

Here's an example:

SELECT MaxId + 10
FROM (SELECT Max(t.Id) As MaxId
      FROM SomeTable t) As SomeTableMaxId
Enrico Campidoglio
  • 56,676
  • 12
  • 126
  • 154
1

You could:

  1. Do the + 10 in the client code
  2. Write a scalar-valued function to encapsulate the logic for complex stuff. It will be optimized into a single call.
  3. Copy complex stuff logic for the other column. It should get optimized out into 1 call.
  4. Use a sub-select to apply the additional calculation
tenfour
  • 36,141
  • 15
  • 83
  • 142
1

One convenient option to reuse scalar expressions in a query is to use APPLY (or LATERAL in standard SQL):

SELECT
  table.id,
  table.number,
  [ColumnA],
  [ColumnA] + 10
FROM 
  table
  CROSS APPLY (SELECT complex stuff [ColumnA]) t
Lukas Eder
  • 211,314
  • 129
  • 689
  • 1,509