2017-12-26 10 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 

이 쿼리는 18,292 안타를 반환합니다.

CASE 문을 제거하고 GROUP BY 섹션에서 DATE_TIME_CREATED 및 DATE_CREATED를 제거하면 쿼리가 1356 건을 반환합니다.

우리는 CASE 문을 사용하여 Google 제품의 제작 과정을 확인했습니다. date_time_created 필드는 기본적으로 시간 소인입니다. 이 테이블에서 제품이 어떤 변화를 일으켰는지 확인할 수있는 유일한 필드입니다.

하지만 결과적으로 우리는 10 배나 많은 히트를 얻을 수 있습니다.

예제로 ORDER_NO 349321을 가져옵니다. 표시된 쿼리를 실행하면 61 개의 조회가 발생합니다. CASE 문을 제거하고 GROUP BY 섹션에서 DATE_TIME_CREATED 및 DATE_CREATED를 제거하면 두 번의 조회가 발생합니다.

2 교대 이상 주문을 완료하지 않았습니다. 따라서 ORDER_NO 349321에 대한 모든 트랜잭션의 타임 스탬프를 알 필요가 없으며 모든 타임 스탬프가 Shift 1 또는 Shift 2에 있는지 여부를 알 필요가 없습니다. 해당 주문에 대한 트랜잭션이 Shift 1 또는 Shift 2에서 완료하십시오.

이 사례 문을 통해 얻은 정보를 집계하여 어떤 방법으로 처리 할 수 ​​있습니까? 나는 MAX와 AVG를 사용하여 내 사례 문장에서 시도했지만 동일한 수의 결과를 반환합니다.

+0

대표적인 데이터 샘플과 원하는 결과를 제공하십시오. –

+1

의도적으로 않는 한 "SHIFT 2"계산에서 OR 조건과 관련된 괄호 집합이 누락 된 것처럼 보입니다. 현재와 ​​같은 방식으로 OR은 다른 조건과 연결되어 있지 않으므로 "AND"조건은 "AND"로 처리되지 않습니다. '(\t ( \t \t (TO_CHAR (date_time_created 'HH24 : MI') BETWEEN '17 : 45 'AND '24 : 00') OR \t \t (TO_CHAR (date_time_created 'HH24 : MI') BETWEEN '00 : 00 '과 '05 : 44')과 \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