select문 속도 개선질문입니다 0 7 2,396

by 지메이비 [SQL Query] MSSQL [2023.04.04 09:31:58]


SELECT 
	storeCode, 
	stockinday, 
	isnull(dbo.uf_storeName(dealercode,storeCode),'창고출고') as storeName, 
	orderday, 
	userid 
	FROM orders 
	where dealerCode='1447' 
	and stockinDay between '20230405' and '20230410' 
    and orderday in (select max(orderday) from orders where dealerCode='1447' and stockinDay between '20230405' and '20230412' group by storecode) 
	group by storecode,stockinday,dbo.uf_storeName(dealercode,storeCode),orderday,userid 

 

현재 코드가 이렇게 되어있는데 주문날짜중 최근날짜 리스트를 뽑는데 147건만 조회해도 18초가 걸리네요.. 속도개선할수있는 방법이있을까요??

by 마농 [2023.04.04 09:56:38]

그룹바이 쿼리인데? 왜 집계함수(sum, count 등) 사용이 없죠?
쿼리의 목적이 뭘까요?

IN 절에도 오류가 있네요.
스토어코드별 맥스 일자를 가져오는데
1번의 맥스일자가 3일이고
2번의 맥스일자가 2일일때
이걸 IN 절로 걸면 스토어코드와 무관하게 2,3일에 해당하는 일자가 모두 추출됩니다.
1번의 3일만 추출이 되어야 하는데 1번의 2일도 추출이 되죠.

메인쿼리의 일자조건과 (20230405 ~ 20230410)
서브쿼리의 일자조건이 (20230405 ~ 20230412) 다른데?
다른게 맞는건가요? 아니면 오타인가요?


by 지메이비 [2023.04.04 10:26:20]

품목을 주문하면 날짜별로 ORDERDAY가 생성되는데 날짜별 가장 최근 ORDERDAY를 가져오는 쿼리입니다.

 

일자조건은 오타입니다. 12일이 맞습니다

4월1일날 a품목이 3월31일 10시에 주문되었고

4월1일날 b품목이 3월31일 11시에 추가주문이 되었다면 발주일자:4월1일 주문일자:3월31일 11시가 떠야하고

4월2일날 c품목이 3월31일 11시에 주문이 되었다면 발주일자:4월2일 주문일자:3월31일 11시가 뜹니다.

이렇게 쭉 날짜별로 리스트를 만들었는데 속도가 잘안나옵니다 ㅠ


by 마농 [2023.04.04 10:46:09]

품목이 뭔가요? storeCode 가 품목인가요?
일자에 시간정보도 포함디 되어 있는지? 그렇다면 조건절 잘못 준것 같기도 합니다.
맥스 일자의 정확한 집계기준이 뭘까요?
어떤 항목들별 맥스 일자인지요?
품목별인지? 날짜별인지? 어떤 날짜별인지?(stockinday? orderday?)
아니면 여러 항목의 복합 기준별 맥스일자 인지?


by 지메이비 [2023.04.04 11:05:37]

품목은 조회되지않습니다 원하는건 storeCode가 주문을 넣은시간과 날짜만 이라서요

orderday에 시간정보도 포함되어있습니다.

A라는 storeCode에서 5개의 품목을 주문했다면 그 품목의 orderday중 제일 높은값만 가져오려고합니다.

storeCode stockinday storeName orderday userid
2001 20230401 A매출처 2023-04-03 13:20:33.433 abcbf
2002 20230401 B매출처 2023-03-29 15:14:05.353 테스트
2003 20230402 A매출처 2023-03-29 10:14:23.190 123123
2004 20230403 C매출처 2023-04-03 13:57:50.093 4235

이런식으로 결과값이나옵니다.

 


by 마농 [2023.04.04 10:58:16]
-- (예시) 발주일자(stockinDay)별 최종 주문일시(orderday)에 대한 주문내역 조회
-- stockinDay 에는 일자만 저장되고 orderday 에는 일시가 저장되는 것으로 이해하고 작성했습니다.
SELECT storeCode
     , stockinday
     , ISNULL(dbo.uf_storeName(dealercode, storeCode), '창고출고') storeName
     , orderday
     , userid
  FROM (SELECT dealercode
             , storeCode
             , stockinday
             , orderday
             , userid
             , RANK() OVER(PARTITION BY stockinday ORDER BY orderday DESC) rk
          FROM orders 
         WHERE dealerCode = '1447'
           AND stockinDay BETWEEN '20230405' AND '20230412'
        ) a
 WHERE rk = 1
-- GROUP BY dealercode, storeCode, stockinday, orderday, userid -- 중복제거 필요시
;

 


by 마농 [2023.04.04 11:08:17]
-- (예시) 매출처(storeCode)별 최종 주문일시(orderday)에 대한 주문내역 조회
SELECT storeCode
     , stockinday
     , ISNULL(dbo.uf_storeName(dealercode, storeCode), '창고출고') storeName
     , orderday
     , userid
  FROM (SELECT dealercode
             , storeCode
             , stockinday
             , orderday
             , userid
             , RANK() OVER(PARTITION BY storeCode ORDER BY orderday DESC) rk
          FROM orders 
         WHERE dealerCode = '1447'
           AND stockinDay BETWEEN '20230405' AND '20230412'
        ) a
 WHERE rk = 1
-- GROUP BY dealercode, storeCode, stockinday, orderday, userid -- 중복제거 필요시
;

 


by 지메이비 [2023.04.04 13:12:01]

감사합니다 마농님!!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입