【问题标题】:SQL Report Error - [Macromedia][SQLServer JDBC Driver][SQLServer]Invalid column nameSQL 报告错误 - [Macromedia][SQLServer JDBC 驱动程序][SQLServer]列名无效
【发布时间】:2017-05-08 22:30:45
【问题描述】:

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

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]列名无效 '占用'。

我不确定我的解释是否正确。我很感激你能提供的任何帮助。

【问题讨论】:

  • 究竟是什么样的功能?哪个应用程序抛出错误?在不了解更多信息的情况下,这听起来像是 SQL 或报告问题。但是,如果没有更多细节,很难给出建议。
  • 这是我收到的错误 ERROR MESSAGE: Unable to call CFC - Error Executing Database Query。错误详细信息:[Macromedia][SQLServer JDBC 驱动程序][SQLServer]列名“OCCUPANCY”无效。
  • (编辑) 哦...您不能在同一级别的计算中使用别名(即在定义之前)。选择是 a) 在计算中重复整个 case 语句或 b) 使用另一个选项,如 CTE、派生查询、`apply 运算符等。见sqlmag.com/blog/tip-apply-and-reuse-column-aliases
  • 你能给我举个例子来说明你在说什么吗?我很难理解。我的 SQL 知识非常基础。
  • SQL 不按您编码的顺序处理事物。基本流程是:FROM >> WHERE >> GROUP BY >> HAVING >> SELECT >> ORDER BY >> TOP。您无法在更高的进程中访问变量。

标签: sql-server coldfusion


【解决方案1】:

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

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

;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。如果不希望这样做,请考虑设置默认值。

【讨论】:

    猜你喜欢
    • 2015-12-13
    • 1970-01-01
    • 2018-03-04
    • 1970-01-01
    • 2017-10-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多