2017-12-26 22 views
0

私は次のクエリで働いている:集約するタイムスタンプ

SELECT contract, 
    source_ref1 AS "ORDER_NO", 
    part_no, 
    ifsapp.inventory_part_api.Get_description(contract, part_no) as "DESCRIPTION", 
    ifsapp.inventory_part_api.Get_unit_meas(contract, part_no) as "UNIT_MEAS", 
    date_applied, 
    (SELECT work_center_no FROM shop_order_operation where inventory_transaction_hist2.source_ref1 = shop_order_operation.order_no) AS "WORK_CENTER", 
    direction, 
     SUM(quantity) AS "QUANTITY", 
     (CASE 
      WHEN ((To_char(date_time_created, 'HH24:MI ') BETWEEN '05:45 ' AND '17:44') AND 
        date_applied = date_created) THEN 'SHIFT1' 
      WHEN (((To_char(date_time_created, 'HH24:MI') BETWEEN '17:45' AND '24:00') OR 
        (To_char(date_time_created, 'HH24:MI') BETWEEN '00:00' AND '05:44') AND 
        date_applied = date_created)) THEN 'SHIFT2' 
      ELSE 'MANUAL_ADJUST' 
     END) AS "SHIFT" 
FROM ifsapp.INVENTORY_TRANSACTION_HIST2 
WHERE part_no IN (select pc.part_no from ifsapp.HH_INV_PART_CHARS pc where pc.accounting_group = '400') AND 
     contract IN ('DE1', 'DE2') AND 
     transaction_code LIKE '%REC%' AND 
     direction IN ('+', '-') AND 
     source_ref_type = 'Shop Order' AND 
     To_char(date_applied, 'YYYY-MM-DD') BETWEEN '2017-01-01' AND '2017-12-26' 
GROUP BY contract,source_ref1, part_no, ifsapp.inventory_part_api.Get_description(contract, part_no), 
ifsapp.inventory_part_api.Get_unit_meas(contract, part_no), location_no, date_applied, direction, 
date_time_created, date_created 
ORDER BY date_applied 

このクエリは、18292本のヒットを返します。

CASE文を削除し、GROUP BYセクションからDATE_TIME_CREATEDおよびDATE_CREATEDを削除すると、クエリは1356ヒットを返します。

私たちはCASEステートメントを使用して、製品の生産シフトを判断しています。 date_time_createdフィールドは基本的にタイムスタンプです。このテーブルでは、製品がどのようにシフトされたかを判断するために使用できる唯一のフィールドです。

しかし、それはまた、私たちがそれなしで10倍のヒットを得る結果となっています。

例としてORDER_NO 349321をとります。表示されているようにクエリを実行すると、私は61ヒットを取得します。 CASE文を削除し、GROUP BYセクションからDATE_TIME_CREATEDとDATE_CREATEDを削除すると、2回ヒットします。

私たちは2回以上のシフトを完了していません。したがって、私はORDER_NO 349321のすべてのトランザクションのタイムスタンプを知る必要はなく、すべてのタイムスタンプがShift 1またはShift 2にあるかどうかを知る必要はありません。 Shift 1またはShift 2で完了しました。

このケースステートメントから得た情報を集計する方法はありますか?私はMAXとAVGを私のcase文で使ってみましたが、同じ数の結果を返しています。

+0

代表的なデータサンプルと目的の結果を提供します。 –

+1

意図的に実行していない限り、 "SHIFT 2"計算でOR条件の周りに括弧が設定されていないように見えます。現在の方法では、ORが他の条件にリンクされていないため、「AND」条件は「AND」として扱われません。 '( \t( \t \t(TO_CHAR(date_time_created、 'HH24:MI')'17 BETWEEN 45' AND '24:00' )OR \t \t(TO_CHAR(date_time_created、 'HH24:MI')BETWEEN '00:00' AND '05:44' )AND \t date_applied = DATE_CREATED \t) ) ' は、この元の問題を修正しませんが、何かが今のに注意すること。 – ravioli

答えて

1

DATE_TIME_CREATED列とDATE_CREATED列を投影する必要がない場合は、集計処理を実行する前にサブクエリで「SHIFT」計算を実行してください。このような何か:

SELECT 
    contract, 
    source_ref1 AS "ORDER_NO", 
    part_no, 
    ifsapp.inventory_part_api.Get_description(contract, part_no) AS "DESCRIPTION", 
    ifsapp.inventory_part_api.Get_unit_meas(contract, part_no) AS "UNIT_MEAS", 
    date_applied, 
    (SELECT work_center_no FROM shop_order_operation WHERE inventory_transaction_hist2.source_ref1 = shop_order_operation.order_no) AS "WORK_CENTER", 
    direction, 
    SUM(quantity) AS "QUANTITY", 
    "SHIFT" 
FROM 
(
    SELECT contract, source_ref1, part_no, date_applied, direction, quantity, 
    (CASE 
     WHEN ((TO_CHAR(date_time_created, 'HH24:MI ') BETWEEN '05:45 ' AND '17:44') AND 
       date_applied = date_created) THEN 'SHIFT1' 
     WHEN (((TO_CHAR(date_time_created, 'HH24:MI') BETWEEN '17:45' AND '24:00') OR 
       (TO_CHAR(date_time_created, 'HH24:MI') BETWEEN '00:00' AND '05:44') AND 
       date_applied = date_created)) THEN 'SHIFT2' 
     ELSE 'MANUAL_ADJUST' 
    END) AS "SHIFT" 
    FROM ifsapp.INVENTORY_TRANSACTION_HIST2 
    WHERE part_no IN (SELECT pc.part_no FROM ifsapp.HH_INV_PART_CHARS pc WHERE pc.accounting_group = '400') 
    AND contract IN ('DE1', 'DE2') 
    AND transaction_code LIKE '%REC%' 
    AND direction IN ('+', '-') 
    AND source_ref_type = 'Shop Order' 
    AND TO_CHAR(date_applied, 'YYYY-MM-DD') BETWEEN '2017-01-01' AND '2017-12-26' 
) src 
GROUP BY 
    contract, 
    source_ref1, 
    part_no, 
    ifsapp.inventory_part_api.Get_description(contract, part_no), 
    ifsapp.inventory_part_api.Get_unit_meas(contract, part_no), 
    location_no, 
    date_applied, 
    direction 
-- ,date_time_created, 
-- date_created 
ORDER BY date_applied 

私はクエリをテストするために、任意のDDL /データを持っていないので、あなたは間違いなくいくつかの構文エラーを取得します。しかし、それを試して、それがどうなるか教えてください。

また、 "SHIFT"計算を確認してください。括弧なしで浮動小数点 "OR"があるようです。

+0

あなたはそれを私の友人:) – ravioli