0

クエリの値をデコードしようとしています。ステータスに基づいてsysdate、列の MAX または 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;

ただし、sysdate は集約関数ではないため、これは ORA-00937 not a single-group group funciton エラーをスローします。詳細な 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 に答える