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 개수 | |
고수 님들의 지도 부탁드립니다.
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 ;