2014-06-09 4 views
0

우리 행에 의하여 선정 된 재고 상품, 행을 통과, 그 재고 항목 각각에 대해 3 개 가장 최근의 판매 주문 번호와 테이블을 채 웁니다 저장 프로 시저가 있습니다TOP 3 기록

INSERT INTO TOP3_STOCK_SALES_DATA 
     (ORDERDATE , 
      SEQNO , 
      STOCKCODE , 
      QUANTITY , 
      ROW 
     ) 
     SELECT TOP 3 
       h.ORDERDATE , 
       h.SEQNO , 
       l.STOCKCODE , 
       l.ORD_QUANT , 
       ROW_NUMBER() OVER (ORDER BY h.ORDERDATE DESC, h.SEQNO DESC) AS row 
     FROM SALESORD_HDR h , 
       SALESORD_LINES l 
     WHERE l.HDR_SEQNO = h.SEQNO 
       AND l.STOCKCODE IN ('1000-ACQ45') 
     ORDER BY h.ORDERDATE DESC , 
       h.SEQNO DESC 

행별로 정렬하지 않고이 명령문을 실행하거나 동일한 결과를 얻는 방법이 있습니까?

+0

일부 샘플 데이터를 추가 할 수 있으며 결과는 무엇이되어야합니까? – Jenn

+0

"대량으로", "행 단위로", 그리고 왜 후자를 전으로 바꾸고 싶은지 설명하십시오. –

+0

insert 문은 한 번에 하나의 주식 코드에 대해 수행됩니다. 처리 할 주식 코드가 25 개라고하면 25 개의 주식 코드 모두에 대해 하나의 insert 문으로 처리 할 수 ​​있기를 원합니다. 각 주식 코드에 대해 가장 최근의 3 개의 판매 주문, 즉 75 개의 행을 한 번에 삽입 할 수 있습니다. – squeel

답변

1

작성한 쿼리는 각 재고 항목에 대해 TOP 3을 반환하지 않지만 반환 된 결과 집합의 TOP 3 레코드 만 반환합니다. 각 재고 항목에 대해 TOP 3을 얻으려면 아래를 참조하십시오.

INSERT INTO TOP3_STOCK_SALES_DATA 
     (ORDERDATE , 
      SEQNO , 
      STOCKCODE , 
      QUANTITY , 
      ROW 
     ) 
SELECT A.ORDERDATE 
     ,A.SEQNO 
     ,A.STOCKCODE 
     ,A.ORD_QUANT 
     ,A.row 
FROM (
     SELECT 
       h.ORDERDATE , 
       h.SEQNO , 
       l.STOCKCODE , 
       l.ORD_QUANT , 
       ROW_NUMBER() OVER (PARTITION BY l.STOCKCODE ORDER BY h.ORDERDATE DESC, h.SEQNO DESC) AS row 
     FROM SALESORD_HDR h 
     INNER JOIN SALESORD_LINES l ON l.HDR_SEQNO = h.SEQNO 
     ) A 
WHERE ROW <= 3 
+0

아직 완전히 테스트하지는 않았지만 내 질문에 완벽하게 답변하는 것처럼 보입니다. 감사합니다! – squeel

+0

관심을 보지 못했던 이유에 대해 왜 내가 어떻게 코딩을했는지 물어볼 수 있습니까? (Inner join SALESORD_LINES l ON l.HDR_SEQNO = h.SEQNO). 개인 선호가 있습니까? 아니면 성능상의 이점이 있습니까? – squeel

+0

BULK 삽입이 아니며 'BULK INSERT'는 SQL Server의 다른 개념과 함께 사용되지만 질문을 읽은 후에는이 솔루션을 사용한 것으로 추측됩니다. 어쨌든 도움이 되었기 때문에 기쁘게 생각합니다. :) –