【问题标题】:AS/400 (Green screen) SQL column variable not foundAS/400(绿屏)未找到 SQL 列变量
【发布时间】:2017-10-20 15:38:48
【问题描述】:

早上好,

我正在 AS/400(绿屏)内运行 SQL 查询,但在提取别名列名时遇到问题。

这是我的脚本:

  /* Join forecast info with item warehouse info */
  SELECT item, itmdsc, 
         today,
         October, QSMOIB,
         (QSMOIB - October) AS Sales_less_October      

    FROM
         /* Summarizing forecast data in a SQL query */
         (SELECT  item, itmdsc, whse,
                 today, range,
                 (wk01 + wk02 + wk03 + wk04) AS October 
            FROM FCSTCUR) AS f      
    JOIN     
         /* Select "Qty sold this period" */
         (SELECT ITNOIB, WHIDIB, QSMOIB
            FROM ITEMBLL0) AS iw

      ON f.item = iw.ITNOIB AND
         f.whse = iw.WHIDIB 
   WHERE Sales_less_October <> 0
ORDER BY Sales_less_October ASC

当我运行它时,我收到错误:

Column or global variable SALES_LESS_OCTOBER not found.

但是,如果我将脚本更改为以下内容,它会按预期工作:

    /* Join forecast info with item warehouse info */
  SELECT item, itmdsc, 
         today,
         October, QSMOIB,
         (QSMOIB - October) /* AS Sales_less_October */   

    FROM
         /* Summarizing forecast data in a SQL query */
         (SELECT  item, itmdsc, whse,
                 today, range,
                 (wk01 + wk02 + wk03 + wk04) AS October 
            FROM FCSTCUR) AS f      
    JOIN     
         /* Select "Qty sold this period" */
         (SELECT ITNOIB, WHIDIB, QSMOIB
            FROM ITEMBLL0) AS iw

      ON f.item = iw.ITNOIB AND
         f.whse = iw.WHIDIB 
   WHERE (QSMOIB - October) <> 0
ORDER BY (QSMOIB - October) ASC

我只是将“Sales_less_October”替换为(QSMOIB - 10 月)。

我真的很希望能够使用别名,因为它比显示“数字表达式”更清晰:

非常感谢,抱歉我无法上传数据……它在我们的服务器上。

【问题讨论】:

  • 你不能。您的解决方法是正确的。在 SELECT 中使用别名,不要在 WHERE 中使用别名。结合您的 2 个查询以获得预期结果。
  • 您实际上可以在 order by 中使用别名,但不能在 where 子句中使用。这一切都与处理的逻辑顺序有关。
  • @SeanLange 是的,您对这个主题有什么阅读建议吗?我对 SQL 还很陌生,并尽可能尝试使用最佳实践。
  • 我会保留您的别名并按顺序保留。您必须在 where 子句中再次包含计算。这是因为它在计算返回值之前确定要返回哪些行。这就是为什么你不能在那里使用别名的原因。这是一篇关于处理订单主题的好文章。 blog.sqlauthority.com/2009/04/06/…

标签: sql sql-server db2-400


【解决方案1】:

如果您想在 WHEREORDER BY 子句中使用别名,则可以将查询的其余部分嵌套在 WITH () 中:

WITH ONE AS (
   SELECT   item, itmdsc, 
            today,
            October, QSMOIB,
            (QSMOIB - October) AS Sales_less_October      

   FROM (
      SELECT   item, itmdsc, whse,
               today, range,
               (wk01 + wk02 + wk03 + wk04) AS October 
      FROM FCSTCUR
      ) AS f      
   JOIN (
      SELECT ITNOIB, WHIDIB, QSMOIB
      FROM ITEMBLL0
      ) AS iw
   ON f.item = iw.ITNOIB
   AND f.whse = iw.WHIDIB
   )
SELECT *
FROM ONE
WHERE Sales_less_October <> 0
ORDER BY Sales_less_October ASC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-10
    相关资源
    最近更新 更多