쿼리하나 만들려는데요 7

by 서산범 [SQL Query] [2023.06.12 08:23:57]


안녕하세요 

지금 사용하는 프로그램 UI수정이 안되는 상황이여서 

쿼리(SQL 스크립?) 이런걸로 데이터 분석 비슷한거 해보려는데 잘안되어서 고수분들에게 문의드려요

몇일째 공부하고 select문 해보는데 안되어서 ㅠㅠ

힌트라도 부탁드립니다.

감사합니다.

======================================================

아래 원본 데이터 설명:

ROWNUM :  테이블에서 유일

SEQ_NO: 테이블에서 유일 (번위->0000~9999, 9999다음 0000 나옵니다.)

BODY_NO:  테이블에서 유일, 단 규칙 없음

TYPE: 부품사양 

STS: 현재 상태(9 완료,7 투입,5 입고,1 대기)

===========================

조회할려는 조건:

TYPE 이 바뀔때 STS가 9가 아닌것, 시작 SEQ_NO 를 표출 및 TYPE의 수량표시.

TYPE 이 A->B->C  혹은  A->B->D  이런패턴으로 수량상관없이 반복출현합니다.

 

---------원본 데이터-----------

ROWNUM SEQ_NO BODY_NO TYPE STS
1 1001 200200 A 9
2 1002 200201 A 7
3 1003 200202 A 7
4 1004 300300 B 7
5 1005 300301 B 7
6 1006 500302 C 7
7 1007 500303 C 5
8 1008 200203 A 5
9 1009 200204 A 5
10 1010 300312 B 5
11 1011 300313 B 5
12 1012 300314 B 5
13 1013 900900 D 1
14 1014 900901 D 1
15 1015 200205 A 1
16 1016 200206 A 1

 

=====원하는 검색결과=======

SEQ_NO BODY_NO TYPE 수량
1002 200201 A 2
1004 300300 B 2
1006 500302 C 2
1008 200303 A 2
1010 300312 B 3
1013 900900 D 2
1015 200205 A 2

 

by 마농 [2023.06.12 09:22:14]

ROWNUM 은 테이블의 값은 아닌거죠? Oracle 의 ROWNUM 맞죠?
seq_no 가 유일한 것 맞나요? 9999 다음에 다시 0000 부터 순환되면 중복 아닌지요?
지금 원본이라고 표현하신 순서대로 출력하기 위한 정렬기준이 있어야 할텐데요?
ROWNUM 은 테이블의 값이 아니고, seq_no 는 중복되어 안되고. 다른 정렬 기준이 필요합니다.


by 서산범 [2023.06.12 09:28:49]

ROWNUM 내부 인덱스,SEQ_NO 유일하며 .9999다음 0000오는데  중복이 안됩니다.0000이 나오면서 그 이전0000은 다른 테이블로 자동이동시키고 있어요. ROWNUM 로 정렬하는걸로 압니다.SEQ_NO 로 정렬하면 0000이 나오는순간 젤위로 올라가는현상이 있어서요


by 서산범 [2023.06.12 09:59:22]

지금 테이블 정보 다시보니 idx 용 하나더 있네요 

최대 99999999999999 까지 사용


by 마농 [2023.06.12 10:28:19]

"ROWNUM 내부 인덱스" 라는게 뭔말인지?
오라클의 ROWNUM 이 아닌 건가요?
다른 DBMS 에서 ROWNUM 이라는 컬럼명을 사용하는 건가요?
ROWNUM 으로 정렬하는 것 맞나요?
만약 9999 의 ROWNUM 이 9999 라면? 그다음 0000 의 ROWNUM 은 10000 이 되는 건가요?
DBMS 종류 및 버전이 뭔지?
ROWNUM 의 정체가 뭔지?
idx 컬럼으로 정렬해도 되는지?


by 서산범 [2023.06.12 10:48:22]

죄송합니다. 

제가 잘못알고있었네요.

정렬은 IDX 로 하고, ROWNUM 프로그램UI에서 한화면에 표시할때 썼던거네요,(C#안에서,데이터베이스 아니고)

실제테이블 보니 ROWNUM는 없고,IDX로 정렬하고 있었습니다.


by 마농 [2023.06.12 12:45:09]
WITH t AS
(
SELECT 1 idx, '1001' seq_no, '200200' body_no, 'A' type, 9 sts FROM dual
UNION ALL SELECT  2, '1002', '200201', 'A', 7 FROM dual
UNION ALL SELECT  3, '1003', '200202', 'A', 7 FROM dual
UNION ALL SELECT  4, '1004', '300300', 'B', 7 FROM dual
UNION ALL SELECT  5, '1005', '300301', 'B', 7 FROM dual
UNION ALL SELECT  6, '1006', '500302', 'C', 7 FROM dual
UNION ALL SELECT  7, '1007', '500303', 'C', 5 FROM dual
UNION ALL SELECT  8, '1008', '200203', 'A', 5 FROM dual
UNION ALL SELECT  9, '1009', '200204', 'A', 5 FROM dual
UNION ALL SELECT 10, '1010', '300312', 'B', 5 FROM dual
UNION ALL SELECT 11, '1011', '300313', 'B', 5 FROM dual
UNION ALL SELECT 12, '1012', '300314', 'B', 5 FROM dual
UNION ALL SELECT 13, '1013', '900900', 'D', 1 FROM dual
UNION ALL SELECT 14, '1014', '900901', 'D', 1 FROM dual
UNION ALL SELECT 15, '1015', '200205', 'A', 1 FROM dual
UNION ALL SELECT 16, '1016', '200206', 'A', 1 FROM dual
-- 샘플 추가 --
UNION ALL SELECT 98, '9999', '200206', 'C', 1 FROM dual
UNION ALL SELECT 99, '0000', '200206', 'C', 1 FROM dual
)
SELECT MIN(seq_no)  KEEP(DENSE_RANK FIRST ORDER BY idx) seq_no
     , MIN(body_no) KEEP(DENSE_RANK FIRST ORDER BY idx) body_no
     , type
     , COUNT(*) cnt
  FROM (SELECT idx, seq_no, body_no, type
             , ROW_NUMBER() OVER(ORDER BY idx)
             - ROW_NUMBER() OVER(PARTITION BY type ORDER BY idx) grp
          FROM t
         WHERE sts != 9
        )
 GROUP BY type, grp
 ORDER BY MIN(idx)
;

 


by 서산범 [2023.06.12 13:41:09]

정말 감사합니다.

제가 타이핑 오류였네요

 

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