我正在尝试解码查询中的值。根据状态,我想要返回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块,最好的方法是什么?
答案 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
)