2017-12-26 2 views
0

내가 쿼리를 개발하기 위해 노력하고있어 후 작동하지 않습니다와 나는 약 2 초 약 49,000 레코드를 가지고이쿼리 피벗

SELECT a.No, 
     a.Finish, 
     a.Shift, 
     a.McCode, 
     d.NAME, 
     b.ItemCode, 
     b.ItemName, 
     b.Qty, 
     b.LotNo, 
     b.Description, 
     CASE 
     WHEN b.Description LIKE '%not good%' THEN 'NG' 
     ELSE 'OK' 
     END          AS OKNG, 
     c.ItemCode        AS matcode, 
     c.LotNo         AS matlot, 
     CASE 
     WHEN e.GroupName = 'CONTACT' THEN 'CONTACT' 
     ELSE 'Coil/Silver/Wire' 
     END          AS GroupName, 
     (c.Qty/(a.Qty + a.QtyNg)) * b.Qty AS materialused 
FROM PPRDDLV a 
     LEFT JOIN ICMUTTRAN b 
       ON a.PrdNo = b.TranNo 
       AND a.No = b.TranId 
     LEFT JOIN ICMUTTRAN c 
       ON a.PrdNo = c.TranNo 
       AND a.Finish = c.DatePost 
       AND c.TranTypeID = 6 
       AND c.LotNo <> '0' 
     LEFT JOIN popr d 
       ON a.OprCode = d.Code 
     LEFT JOIN ICITEM e 
       ON c.ItemId = e.id 
WHERE c.qty IS NOT NULL 
     AND b.ItemCode IS NOT NULL 

같은 것을 가지고, 그때 나는 열을 피벗 wan't 그 값의 2 종류가 있습니다, 그래서 나는이

SELECT no, 
     finish, 
     shift, 
     mccode, 
     NAME, 
     itemcode, 
     itemname, 
     qty, 
     lotno, 
     description, 
     okng, 
     matcode, 
     matlot 
FROM (SELECT a.No, 
       a.Finish, 
       a.Shift, 
       a.McCode, 
       d.NAME, 
       b.ItemCode, 
       b.ItemName, 
       b.Qty, 
       b.LotNo, 
       b.Description, 
       CASE 
       WHEN b.Description LIKE '%not good%' THEN 'NG' 
       ELSE 'OK' 
       END          AS OKNG, 
       c.ItemCode        AS matcode, 
       c.LotNo         AS matlot, 
       CASE 
       WHEN e.GroupName = 'CONTACT' THEN 'CONTACT' 
       ELSE 'Coil/Silver/Wire' 
       END          AS GroupName, 
       (c.Qty/(a.Qty + a.QtyNg)) * b.Qty AS materialused 
     FROM PPRDDLV a 
       LEFT JOIN ICMUTTRAN b 
         ON a.PrdNo = b.TranNo 
         AND a.No = b.TranId 
       LEFT JOIN ICMUTTRAN c 
         ON a.PrdNo = c.TranNo 
         AND a.Finish = c.DatePost 
         AND c.TranTypeID = 6 
         AND c.LotNo <> '0' 
       LEFT JOIN popr d 
         ON a.OprCode = d.Code 
       LEFT JOIN ICITEM e 
         ON c.ItemId = e.id 
     WHERE c.qty IS NOT NULL 
       AND b.ItemCode IS NOT NULL) AS a 
     PIVOT (Max(materialused) 
      FOR groupname IN ([CONTACT], 
           [Coil/Silver/Wire])) AS b 

처럼 뭔가를 설정하지만 쿼리도 십분 후, 그것도 하나의 기록을 표시하지 않습니다 완료되지 않습니다. 내가 피벗을 사용하기 전에 첫 번째 쿼리는 a.no로 명령을 내렸지 만 실행했을 때 결과는 105로 표시되지만 쿼리는 여전히 작동 중이며 더 이상 레코드가로드되지 않았습니다.

아무도 내가 무슨 일이 일어나는지 알 수 있습니까? 감사합니다.

다음은 내부 쿼리에서 수집 한 샘플 데이터와 쿼리 후 예상 값입니다. enter image description here

내가 거기 안하면서 (여전히하지만 작동, 및 열 "물질이 사용"에 대한 유의하지 않은 선택 외부에 "matcode"를 선택한 실현, 나중에 그것을 사용할 것 피벗이 완료된 후

+0

쿼리의 일부 샘플 데이터와 예상 된 결과 – Squirrel

+0

성능 문제를 게시하시기 바랍니다 그래서 당신의 query.Why이 테이블 사용 "ICMUTTRAN"테이블 힌트 "(NOLOCK)와"에 가입하고 사용 왼쪽 피하려고 여러 번? –

+0

@Squirrel 피벗 후 내부 쿼리와 예상 값의 샘플 데이터를 게시 할 수 있습니까? 왜냐하면 내부 쿼리는 데이터 수집을위한 일반적인 SQL이라고 생각하기 때문입니다. – Reynaldi

답변

0

피벗 대신 조건부 집계를 사용해보십시오.

SELECT no, 
     finish, 
     shift, 
     mccode, 
     NAME, 
     itemcode, 
     itemname, 
     qty, 
     lotno, 
     description, 
     okng, 
     matcode, 
     matlot, 
     [CONTACT] = Max(CASE WHEN GroupName = 'CONTACT' THEN materialused END), 
     [Coil/Silver/Wire] = Max(CASE WHEN GroupName <> 'CONTACT' THEN materialused END) 
FROM (<inner query>) AS a 
GROUP BY no, 
      finish, 
      shift, 
      mccode, 
      NAME, 
      itemcode, 
      itemname, 
      qty, 
      lotno, 
      description, 
      okng, 
      matcode, 
      matlot 
+0

여전히 작동하지 않았지만 데이터가 문제라고 생각하기 시작했지만 가능합니까? 또는 외부 쿼리에서 선택된 열로 인해 쿼리에 데이터가 표시되지 않을 수 있습니까? (나는 그냥 거기에 있으면 안되는 것을 선택하고, 샘플 데이터와 함께 나의 질문에 편집했다.) – Reynaldi

0
---IF you don't have index on filter columns then try to apply for performance 

SELECT a.No, 
     a.Finish, 
     a.Shift, 
     a.McCode, 
     d.NAME, 
     b.ItemCode, 
     b.ItemName, 
     b.Qty, 
     b.LotNo, 
     b.Description, 
     CASE WHEN b.Description LIKE '%not good%' THEN 'NG' 
       ELSE 'OK' 
       END AS OKNG, 
    c.ItemCode, 
    c.LotNo, 
    MAX(CASE WHEN e.groupname ='CONTACT' THEN (c.Qty/(a.Qty + a.QtyNg)) * b.Qty END)OVER(ORDER BY a.no) AS [CONTACT], 
     MAX(CASE WHEN e.groupname ='Coil/Silver/Wire' THEN (c.Qty/(a.Qty + a.QtyNg)) * b.Qty END)OVER(ORDER BY a.no) AS [Coil/Silver/Wire] 
FROM PPRDDLV a WITH(NOLOCK) 
     LEFT JOIN ICMUTTRAN b WITH(NOLOCK) 
       ON a.PrdNo = b.TranNo 
       AND a.No = b.TranId 
     LEFT JOIN ICMUTTRAN c WITH(NOLOCK) 
       ON a.PrdNo = c.TranNo 
       AND a.Finish = c.DatePost 
       AND c.TranTypeID = 6 
       AND c.LotNo <> '0' 
     LEFT JOIN popr d WITH(NOLOCK) 
       ON a.OprCode = d.Code 
     LEFT JOIN ICITEM e 
       ON c.ItemId = e.id 
WHERE c.qty IS NOT NULL 
     AND b.ItemCode IS NOT NULL 
+0

모든 행을 가져 왔지만 모든 수량은 "CONTACT"열로 갔다. 51 분도 걸렸다. 나는 실제로 NOLOCK의 작동 방식을 이해하지 못한다.하지만 다른 프로세스에서 값을 사용하고 있어도 쿼리를 수행 할 수 있도록 이해하고 있는가? – Reynaldi