Search code examples
sqlsql-servert-sqlspatial-query

How to use a calculated column to calculate another column in the same query using a subquery


I'm trying to add a new calculated field (TravelTime) based on the NLength and NSpeedLimit fields from the following query

SELECT          
        sc.OBJECTID, 
        sn.Name, 
        case    when hn.side = 'Right Side' then ''
            else sc.LCity
        end as LCity, 
        case    when hn.side = 'Left Side' then ''
            else sc.RCity
        end as RCity, 
        case    when hn.side = 'Right Side' then ''
            else sc.LZip
        end as LZip, 
        case    when hn.side = 'Left Side' then ''
            else sc.RZip
        end as RZip, 
        sc.SHAPE.STLength() AS NLength,
        ISNULL(sc.SpeedLimit,1) AS NSpeedLimit

FROM            STREETNAME AS sn 
    INNER JOIN
                STREETHASSTREETNAME AS hn ON 
                         sn.GlobalID = hn.GlobalID AND 
                         hn.Role = 'Primary'
INNER JOIN      STREETCENTERLINE AS sc ON 
                hn.GlobalID = sc.GlobalID

The new calculated field is TravelTime = NLength/(NSpeedLimit*88) but I can't add NLength/(NSpeedLimit*88) AS TravelTimein the select statement. I know I need to do a subquery but I don't know where it's supposed to go.


Solution

  • You can use Temp_tables, Derived tables or Common table expressions (CTE) to obtain the result. Simple approach would be Derived table as you dont need much more coding.

      SELECT A.*
      ,  A.NLength/(A.NSpeedLimit * 88)  as [TravelTime]
      FROM
      (
    
    
      SELECT          
        sc.OBJECTID, 
        sn.Name, 
        case    when hn.side = 'Right Side' then ''
            else sc.LCity
        end as LCity, 
        case    when hn.side = 'Left Side' then ''
            else sc.RCity
        end as RCity, 
        case    when hn.side = 'Right Side' then ''
            else sc.LZip
        end as LZip, 
        case    when hn.side = 'Left Side' then ''
            else sc.RZip
        end as RZip, 
        sc.SHAPE.STLength() AS NLength,
        ISNULL(sc.SpeedLimit,1) AS NSpeedLimit
    
      FROM    STREETNAME AS sn 
       INNER JOIN
                STREETHASSTREETNAME AS hn ON 
                         sn.GlobalID = hn.GlobalID AND 
                         hn.Role = 'Primary'
              INNER JOIN      STREETCENTERLINE AS sc ON 
                  hn.GlobalID = sc.GlobalID
    
                ) AS A