0

我正在尝试解码查询中的值。根据状态,我想返回sysdate或列的 MAX:

SELECT DECODE(t2.productstatus, 'Stores', SYSDATE, MAX(t1.actual_moveout))
  INTO v_last_moveout
  FROM rw_product_flow t1
  JOIN rw_product_master t2
    ON t1.facility = t2.facility
   AND t1.product = t2.product
 WHERE t1.facility = p_facility
   AND t1.product = p_product;

但是,这会引发 ORA-00937 not a single-group group funciton 错误,因为 sysdate 不是聚合函数。在不编写详细的 IF 块的情况下实现此目的的最佳方法是什么?

4

2 回答 2

1

您可以Max在没有 的情况下单独使用它group by,但是一旦您还需要其他信息,您就需要对数据进行分组。(这里的 MySQL 不同,在许多情况下为非分组列提供合理的默认值)

我的心理调试能力告诉我

GROUP BY t1.facility, t1.product, t2.productstatus

会做你需要的。

于 2012-11-15T19:35:36.710 回答
0

试试这个:

SELECT DECODE(t2.productstatus, 'Stores', SYSDATE, MAX(t1.actual_moveout) over ())
  INTO v_last_moveout
  FROM rw_product_flow t1
  JOIN rw_product_master t2
    ON t1.facility = t2.facility
   AND t1.product = t2.product
 WHERE t1.facility = p_facility
   AND t1.product = p_product;

我不是 100% 确定你可以在解码中嵌套一个窗口(又名分析)函数。如果这给您带来错误,则可以使用派生表轻松解决:

select DECODE(productstatus, 'Stores', SYSDATE, max_moveout)
from (
    SELECT t2.productstatus, 
           MAX(t1.actual_moveout) over () as max_moveout
      INTO v_last_moveout
      FROM rw_product_flow t1
      JOIN rw_product_master t2
        ON t1.facility = t2.facility
       AND t1.product = t2.product
     WHERE t1.facility = p_facility
       AND t1.product = p_product
) 
于 2012-11-15T19:39:15.223 回答