【问题标题】:How to use a calculated column to calculate another column in the same query using a subquery如何使用计算列计算同一查询中使用子查询的另一列
【发布时间】:2021-05-20 07:09:04
【问题描述】:

我正在尝试根据以下查询中的 NLength 和 NSpeedLimit 字段添加一个新的计算字段 (TravelTime)

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

新的计算字段是 TravelTime = NLength/(NSpeedLimit*88) 但我不能在选择语句中添加NLength/(NSpeedLimit*88) AS TravelTime。我知道我需要做一个子查询,但我不知道它应该去哪里。

【问题讨论】:

标签: sql sql-server tsql spatial-query


【解决方案1】:

您可以使用 Temp_tables、派生表或公用表表达式 (CTE) 来获取结果。简单的方法是派生表,因为您不需要更多的编码。

  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

【讨论】:

    【解决方案2】:

    您可以使用applyFROM 子句中添加列:

    SELECT . . .
           v.NLength, v.NSpeedLimit, 
            (v.NLength / (v.NSpeedLimit*88)) as TravelTime
    FROM STREETNAME sn JOIN
         STREETHASSTREETNAME hn
         ON sn.GlobalID = hn.GlobalID AND 
            hn.Role = 'Primary' JOIN
         STREETCENTERLINE sc
         ON hn.GlobalID = sc.GlobalID CROSS APPLY
         (VALUES (sc.SHAPE.STLength(), COALESCE(sc.SpeedLimit, 1)
         ) v(NLength, NSpeedLimit)
    

    【讨论】:

      猜你喜欢
      • 2019-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-07-03
      • 1970-01-01
      • 2013-10-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多