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 개수 | |
고수 님들의 지도 부탁드립니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 | 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 ; |