使用聚合和非聚合结果进行解码

时间:2012-11-15 17:11:10

标签: sql oracle10g

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

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不是单组组函数错误,因为sysdate不是聚合函数。如果不编写冗长的IF块,最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

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

我的通灵调试能力告诉我

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

会做你需要的。

答案 1 :(得分: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
)