2012-11-15 90 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 
)