2017-05-08 34 views
1

我们使用基于ColdFusion的外壳软件,并使用SQL在我们的报告中创建数据库功能。我正在制作自定义报告以尝试从另一列中减去一列:更具体地说,从OCCUPANCY中减去COUNT_OF_INSPECTION_TYPE。该OCCUPANCY列是基于以下代码:SQL报告错误 - [Macromedia] [SQLServer JDBC驱动程序] [SQLServer]无效的列名称

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,我得到一个错误:

​​3210

我不知道如果我解释这个权利。我会很感激你可以提供的任何帮助。

+0

究竟是什么样的功能?哪个应用程序正在抛出错误?不知道更多,这听起来像一个SQL或报告问题。但是,如果没有更多细节,很难提供建议。 – Leigh

+0

这是我收到的错误错误消息: 无法调用CFC - 执行数据库查询时出错。 错误详细信息: [Macromedia] [SQLServer JDBC驱动程序] [SQLServer]无效的列名称'OCCUPANCY'。 – DANNYJ1

+1

(编辑)哦......你不能在同一级别的计算中(即在定义之前)使用*别名*。选择要么a)在计算中重复整个case语句或b)使用另一个选项,如CTE,派生查询,应用操作符等。请参阅http://sqlmag.com/blog/tip-apply-and-reuse-column-aliases – Leigh

回答

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条件,计算的结果将是NULL如果没有HallName的比赛。如果这不可取,请考虑设置默认值。

相关问题