쿼리좀 봐주시기 바랍니다.(글은 저쪼~아래) 0 4 1,708

by 승환부인 [SQL Query] [2011.06.15 20:47:58]


WORK_DATE LINE_ID MODEL_ID SHIFT WC_TYPE LOT_ID LOT_TYPE IN_QTY OUT_QTY LOSS_CODE LOSS_QTY
20110510 X30 XPB 1 D XPBKE023 0 2440 2420    104 5
20110510 X30 XPB 1 D XPBKE023 0 2440 2420    112 2
20110510 X30 XPB 1 D XPBKE023 0 2440 2420     201 7
20110510 X30 XPB 1 D XPBKE023 0 2440 2420     404 6
20110510 X30 XPB 1 D XPBKE033 0 3170 3148 112 3
20110510 X30 XPB 1 D XPBKE033 0 3170 3148     201 7
20110510 X30 XPB 1 D XPBKE033 0 3170 3148    404 12
20110510 X30 XPB 2 D XPBKE033 0 6382 6350    104 3
20110510 X30 XPB 2 D XPBKE033 0 6382 6350    112 3
20110510 X30 XPB 2 D XPBKE033 0 6382 6350    116 1
20110510 X30 XPB 2 D XPBKE033 0 6382 6350    201 7
20110510 X30 XPB 2 D XPBKE033 0 6382 6350   404 18



위와 같은 데이터가 있습니다.

여기서 제가 원하는 것은 in_qty 수량과 loss_code 별 loss_qty 입니다.
단순히 sum을 해서 되는게 아니고;; 보시면 아시겠지만 in_qty가 같은 것은 같은 장비를 지났다는 것입니다.
즉 키가 work_date, line_id, model_id, shift, wc_type, lot_id, in_qty, loss_code 입니다.;;;
loss_code 별로 loss 수량이 있고 이때
한 입력에 대해 다양한 loss_code가 발생할 수 있으므로
입력 수량들이 같은 것은 다 sum이 되면 안됩니다.

즉 위 데이터에서 in_qty 는 2440+3017+6382 인 11992 이고  그 때 조건으로 loss_code를 넣으면 그에 맞는 loss_qty가 나와야 합니다.

그런데 만만치가 않네요;;group by를 어디로 해야할 지;; loss_code가 '104'로 하면 in_qty가 하나가 덜보여서 11992가 안되기도 하고;;;



SELECT a.WORK_DATE
  , NVL(SUM(a.IN_QTY), 0) AS INPUT_VAL
  , DECODE(NVL(SUM(a.IN_QTY), 0), 0, 0, NVL(SUM(b.LOSS_QTY), 0) / SUM(a.IN_QTY)) AS P_VAL  
FROM(
    SELECT  work_date, lot_id, shift,in_qty, NVL(loss_qty,0) FROM WC_WORKLOG_DETAIL WHERE work_date ='20110510' AND model_id = 'XPB' AND wc_type = 'D' AND substr(lot_id,8,1) = '3'-- AND loss_code = '104'
GROUP BY work_date, lot_id, shift, in_qty,loss_qty    -- ,loss_code, loss_qty

    ) a,
    (
   SELECT  work_date, lot_id, shift, in_qty, loss_qty FROM WC_WORKLOG_DETAIL WHERE work_date ='20110510' AND model_id = 'XPB' AND wc_type = 'D' AND substr(lot_id,8,1) = '3' AND loss_code = '104'
GROUP BY work_date, lot_id, shift, in_qty ,loss_qty   -- ,loss_code, loss_qty
   ) b  

GROUP BY a.WORK_DATE   

이렇게 해도 11992가 안되고;;;;

SELECT WORK_DATE
  , NVL(SUM(IN_QTY), 0) AS INPUT_VAL
  , DECODE(NVL(SUM(IN_QTY), 0), 0, 0, NVL(SUM(LOSS_QTY), 0) / SUM(IN_QTY)) AS P_VAL  
FROM(
  SELECT WORK_DATE, IN_QTY
   ,SUM( LOSS_QTY) AS LOSS_QTY
  FROM WC_WORKLOG_DETAIL

where MODEL_ID = 'XPB'
and WC_TYPE = 'D'

--and LOSS_CODE = '104'
--and LOT_TYPE = '0'
and WORK_DATE >= '20110510'
and WORK_DATE <='20110510'
and 1=1
GROUP BY WORK_DATE, IN_QTY,  SHIFT
)
where 1=1
--and IN_QTY > TO_NUMBER(@I_MINVALUE)
and 1=1
GROUP BY WORK_DATE   
이렇게 해도 안되고;;;

loss_code는 조건으로 들어가더라도 in_qty는 항상 11992가 나와야 하는데;;;어떻게 하면 좋을까요?ㅠㅠ

부탁드립니다.ㅠㅠ

꼬옥꼬옥좀 봐주세요.ㅠㅠ

by 승환부인 [2011.06.16 08:14:52]
SELECT WORK_DATE
, NVL(SUM(IN_QTY), 0) AS INPUT_VAL
, DECODE(NVL(SUM(IN_QTY), 0), 0, 0, NVL(SUM(LOSS_QTY), 0) / SUM(IN_QTY)) AS P_VAL
FROM(


SELECT a.work_date, a.in_qty AS in_qty, b.loss_qty AS loss_qty FROM
(
SELECT work_date, lot_id, shift,in_qty FROM WC_WORKLOG_DETAIL WHERE work_date >='20110510' AND work_date <='20110520' AND model_id = 'XPB' AND wc_type = 'D' AND substr(lot_id,8,1) = '3' --AND loss_code = '104'
GROUP BY work_date, lot_id, shift, in_qty
) a,
(
SELECT work_date, lot_id, shift,in_qty,SUM(nvl(loss_qty,0))AS loss_qty FROM WC_WORKLOG_DETAIL WHERE work_date >='20110510' AND work_date <='20110520' AND model_id = 'XPB' AND wc_type = 'D' AND substr(lot_id,8,1) = '3' AND loss_code = '104'
GROUP BY work_date, lot_id, shift, in_qty
) b
WHERE a.work_date = b.work_date(+)
AND a.lot_id=b.lot_id(+)
AND a.shift=b.shift(+)
AND a.in_qty= b.in_qty(+)
--GROUP BY a.work_date

)
where 1=1
--and IN_QTY > TO_NUMBER(@I_MINVALUE)
and 1=1
GROUP BY WORK_DATE


이렇게 하니 되네요;;; 그런데 혹시 더 간단하게 안되려나요?????

by 마농 [2011.06.16 08:42:18]
SELECT work_date
, SUM(DISTINCT in_qty) in_qty
, SUM(DECODE(loss_code, '104', loss_qty)) loss_qty
, SUM(DECODE(loss_code, '104', loss_qty)) / NULLIF(SUM(DISTINCT in_qty), 0) p_val
FROM wc_worklog_detail
WHERE work_date >='20110510'
AND work_date <='20110520'
AND model_id = 'XPB'
AND wc_type = 'D'
AND SUBSTR(lot_id, 8, 1) = '3'
GROUP BY work_date
;

by 승환부인 [2011.06.16 08:55:40]
이른 시간에 감사합니다.^^ decode와 distinct를 써서~~ㅎㅎㅎ
흠...그런데 이게 입력 수량이라...
만약이지만 입력 수량이 같다면 distinct를 써도 될까요???
ㅎㅎ 죄송하지만 이런 경우엔 어떻게 해야 할 지;;;
서로 다른 공정이지만 입력 수량이 같아버리면 하나로 group화 되는거 아닌가요?

by 마농 [2011.06.16 09:17:50]
SELECT work_date
, SUM(in_qty) in_qty
, SUM(loss_qty) loss_qty
, SUM(loss_qty) / NULLIF(SUM(in_qty), 0) p_val
FROM
(
SELECT work_date
, in_qty
, SUM(DECODE(loss_code, '104', loss_qty)) loss_qty
FROM wc_worklog_detail
WHERE work_date >='20110510'
AND work_date <='20110520'
AND model_id = 'XPB'
AND wc_type = 'D'
AND SUBSTR(lot_id, 8, 1) = '3'
GROUP BY work_date, line_id, model_id, shift, wc_type, lot_id, in_qty
)
GROUP BY work_date
;
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입