SQL报告错误 - [Macromedia] [SQLServer JDBC驱动程序] [SQLServer]列名无效

时间:2017-05-08 22:30:45

标签: sql-server coldfusion

我们使用基于ColdFusion的住房软件,并使用SQL在我们的报告中创建数据库功能。我正在处理自定义报告,尝试从另一列中减去一列:更具体地说,从COUNT_OF_INSPECTION_TYPE中减去OCCUPANCYOCCUPANCY列基于以下代码:

CONVERT(INT
        , CASE 
               WHEN tblHalls.HALLNAME = 'Hall1' THEN 198 
               WHEN tblHalls.HALLNAME = 'Hall2' THEN 430  
               WHEN tblHalls.HALLNAME = 'Hall3' THEN 333 
         END
      )

当我尝试新功能OCCUPANCY - COUNT_OF_INSPECTION_TYPE时,出现错误:

  

无法调用CFC - 执行数据库查询时出错。 [Macromedia] [SQLServer JDBC驱动程序] [SQLServer]列名无效   'OCCUPANCY'。

我不确定我是否正在解释这一点。我很感激您提供的任何帮助。

1 个答案:

答案 0 :(得分:5)

您无法创建alias并在同一级别的其他计算中使用它,因为别名尚未定义。要么在计算中重复整个CASE ... END语句(不太理想),要么使用其他选项,例如CTE, derived table, APPLY operator, etcetera

CTE中包装现有的SELECT可能是最简单的选项之一:

;WITH cte
AS
(
    -- Your current SELECT statement goes here
    SELECT 
        CONVERT(INT
                , CASE 
                       WHEN tblHalls.HALLNAME = 'Hall1' THEN 198 
                       WHEN tblHalls.HALLNAME = 'Hall2' THEN 430  
                       WHEN tblHalls.HALLNAME = 'Hall3' THEN 333 
                 END
        ) 
        AS OCCUPANCY
        , tblHalls.COUNT_OF_INSPECTION_TYPE
        , ... (Other Columns)
    FROM  tblHalls
)
-- Now use the alias in a calculation
SELECT cte.*
        , cte.OCCUPANCY - cte.COUNT_OF_INSPECTION_TYPE AS SomeAliasForThisCol
FROM   cte

旁注,由于CASE语句没有定义ELSE条件,如果没有HallName匹配,计算结果将为NULL。如果不希望这样,请考虑设置默认值。