안녕하세요
지금 사용하는 프로그램 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 |
ROWNUM 은 테이블의 값은 아닌거죠? Oracle 의 ROWNUM 맞죠?
seq_no 가 유일한 것 맞나요? 9999 다음에 다시 0000 부터 순환되면 중복 아닌지요?
지금 원본이라고 표현하신 순서대로 출력하기 위한 정렬기준이 있어야 할텐데요?
ROWNUM 은 테이블의 값이 아니고, seq_no 는 중복되어 안되고. 다른 정렬 기준이 필요합니다.
ROWNUM 내부 인덱스,SEQ_NO 유일하며 .9999다음 0000오는데 중복이 안됩니다.0000이 나오면서 그 이전0000은 다른 테이블로 자동이동시키고 있어요. ROWNUM 로 정렬하는걸로 압니다.SEQ_NO 로 정렬하면 0000이 나오는순간 젤위로 올라가는현상이 있어서요
지금 테이블 정보 다시보니 idx 용 하나더 있네요
최대 99999999999999 까지 사용
"ROWNUM 내부 인덱스" 라는게 뭔말인지?
오라클의 ROWNUM 이 아닌 건가요?
다른 DBMS 에서 ROWNUM 이라는 컬럼명을 사용하는 건가요?
ROWNUM 으로 정렬하는 것 맞나요?
만약 9999 의 ROWNUM 이 9999 라면? 그다음 0000 의 ROWNUM 은 10000 이 되는 건가요?
DBMS 종류 및 버전이 뭔지?
ROWNUM 의 정체가 뭔지?
idx 컬럼으로 정렬해도 되는지?
죄송합니다.
제가 잘못알고있었네요.
정렬은 IDX 로 하고, ROWNUM 프로그램UI에서 한화면에 표시할때 썼던거네요,(C#안에서,데이터베이스 아니고)
실제테이블 보니 ROWNUM는 없고,IDX로 정렬하고 있었습니다.
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)
;
정말 감사합니다.
제가 타이핑 오류였네요