2012-11-15 66 views
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不是一个单一的组群功能可按错误,因为SYSDATE不是一个聚合函数。如何在不编写详细的IF块的情况下达到此目的的最佳方法是什么?

+1

这不需要一个'组通过t2.productstatus'? – Laurence

+0

是的,是的。添加'GROUP BY t1.facility,t1.product,t2.productstatus'可以得到理想的结果。 – Paul

+0

@Laurence - 看起来我们有赢家;请添加,作为答案,也许有一些解释。 –

回答

1

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

我的心理调试能力告诉我,

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

会做你的需要。

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 
)