ROW별 COLUMN별 값 비교 0 4 4,711

by 구사일생 [SQL Query] ROW별 COLUMN별 값비교 현재ROW다음ROW값비교 [2023.12.14 23:08:45]


데이터 이관 후 검증을 엑셀에서 흔이들 하는 방법처럼 SQL로도 할수 있는지 문의 드립니다.

데이터도 많고 컬럼도 많아서 엑셀로는 현실적으로 매우 어렵네요(엄청 시간이 걸리고 쪼게서 진행해야 하고)

이관한 데이터의 전 건을 컬럼별로 검증 확인 하고 싶습니다.

  지점코드 상품코드 거래일자 금액 이자    
  A001 S001 20231001 100000 1000    
  B001 S002 20231002 10000 100    
  C001 S002 20231001 45000 450    
               
OLD A001 S001 20231001 100000 1000    
NEW A001 S002 20231001 100000 1000    
  TRUE FALSE TRUE TRUE TRUE 1 <<==FALSE 개수
OLD B001 S002 20231002 10000 100    
NEW B001 S003 20231002 20000 200    
  TRUE FALSE TRUE FALSE FALSE 3 <<==FALSE 개수
OLD C001 S002 20231001 45000 450    
NEW C001 S002 20231001 46000 460    
  TRUE TRUE TRUE FALSE FALSE 2 <<==FALSE 개수
               

 

고수 님들의 지도 부탁드립니다.

by pajama [2023.12.14 23:42:12]

사용하시는 dbms에서 지원된다면 intersect나 except를 사용하셔서 비교하시면 될듯합니다.


by 마농 [2023.12.15 10:45:49]
WITH tab_old AS
(
SELECT 'A001' pk, 'S001' cd, '20231001' dt, 100000 v1, 1000 v2 FROM dual
UNION ALL SELECT 'B001', 'S002', '20231002',  10000,  100 FROM dual
UNION ALL SELECT 'C001', 'S002', '20231001',  45000,  450 FROM dual
UNION ALL SELECT 'D001', 'S002', '20231001',  45000,  450 FROM dual
)
, tab_new AS
(
SELECT 'A001' pk, 'S002' cd, '20231001' dt, 100000 v1, 1000 v2 FROM dual
UNION ALL SELECT 'B001', 'S003', '20231002',  20000,  200 FROM dual
UNION ALL SELECT 'C001', 'S002', '20231001',  46000,  460 FROM dual
UNION ALL SELECT 'E001', 'S002', '20231001',  45000,  450 FROM dual
)
SELECT pk
     , gb
     , DECODE(GROUPING(gb), 1, CASE WHEN COUNT(DISTINCT cd) = 2 OR COUNT(*) = 1 THEN 'FALSE' ELSE 'TRUE' END, cd) cd
     , DECODE(GROUPING(gb), 1, CASE WHEN COUNT(DISTINCT dt) = 2 OR COUNT(*) = 1 THEN 'FALSE' ELSE 'TRUE' END, dt) dt
     , DECODE(GROUPING(gb), 1, CASE WHEN COUNT(DISTINCT v1) = 2 OR COUNT(*) = 1 THEN 'FALSE' ELSE 'TRUE' END, v1) v1
     , DECODE(GROUPING(gb), 1, CASE WHEN COUNT(DISTINCT v2) = 2 OR COUNT(*) = 1 THEN 'FALSE' ELSE 'TRUE' END, v2) v2
     , DECODE(GROUPING(gb), 1, CASE WHEN COUNT(DISTINCT cd) = 2 OR COUNT(*) = 1 THEN 1 ELSE 0 END
                             + CASE WHEN COUNT(DISTINCT dt) = 2 OR COUNT(*) = 1 THEN 1 ELSE 0 END
                             + CASE WHEN COUNT(DISTINCT v1) = 2 OR COUNT(*) = 1 THEN 1 ELSE 0 END
                             + CASE WHEN COUNT(DISTINCT v2) = 2 OR COUNT(*) = 1 THEN 1 ELSE 0 END
                             ) cnt
  FROM (SELECT 'OLD' gb, pk, cd, dt, v1, v2 FROM tab_old
         UNION ALL
        SELECT 'NEW' gb, pk, cd, dt, v1, v2 FROM tab_new
        )
 GROUP BY pk, ROLLUP((gb, cd, dt, v1, v2))
 ORDER BY pk, gb DESC NULLS LAST
;

 


by 구사일생 [2023.12.15 22:19:23]

금일도 어제 드렸던 질문에 답을 찾기 위해 계속 테스트 해보다가 야근 하고 늦게 귀가 했는데 좋은 소식이 기다리고 있었네요

내일도 어제 질문 드렸던 부분을 진행 하기 위해 출근을 해야 합니다. 

바로 적용 해보고 결과 올리겠습니다. 어떤 결과가 나올런지 벌써 가슴이 두근 거리네요 

암튼 정말 감사 합니다.

아 ~~ 그리고 사용하는 DB는 오라클 19C 엑사 입니다.

intersect나 except 이런 함수가 있는지도 함 확인해 봐야 겠네요 모두들 감사 합니다.


by 구사일생 [2023.12.18 21:03:26]

알려주신 내용을 회사에서 적용 해 봤습니다.

PK로 ALIAS한 부분도 값으로 검증 대상이어서 임의의 PK를 정렬 후 만들어 보았습니다 확인하려는 2줄의 데이트를 정렬후 DENSE_RANK로 만든 값을PK로 만들어 위 SQL적용 해 봤더니 잘 되더군요

예상 대로 많은 부분의 수정 사항이 걍 바로 보이 더군요 

SQL잘 적용 되어 좋았으나 수정사항이 많아 며칠 바쁠 듯 합니다. 감사합니다.

갑자기 추워진 날씨에 모두들 건강 유의 하세요

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