안녕하세요 .. 요새 직장에 다시 들어가서 정신없이 배우느라 포스팅할 시간이없어서 주말동안에 회사에서 배운것을 정리할겸 포스팅을 할계획입니다 (_ _)
회사업무 특성상 집계, 카운팅을 자주 하게되는데 오늘 배운 쿼리를 공부 할겸 다시보기 해보려고한다
클라이언트의 요구사항은 이것이었다
일반회원중 등급 1, 등급 2의 거주지역을 시도별로 집계 해달라는것이었다
1. 우선 일반회원중 등급이 1,2 인 사람들의 총합을 구해보도록 하려한다
1 2 3 4 5 | /* 총회원(등급 1,2) */ SELECT COUNT(*) FROM USER_MASTER UM (NOLOCK) -- 유저 마스터 테이블 ( 개인회원 , 기업회원 ) JOIN USER_PERSONAL UP (NOLOCK) ON UP.[USER_ID] = UM.[USER_ID] WHERE UM.USER_FG IN ('1', '2') -- 개인회원중 등급이 1,2인 회원 | cs |
총회원을 구한후 평소와 같이
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | /* 정상우편번호 회원(등급 1,2) */ SELECT T.COUNTY, COUNT(T.[USER_ID]) AS CNT -- 시도 (서울,경기,부산) , 시도별 유저수 카운팅 INTO #ADDRESS1 FROM ( SELECT Z.COUNTY, UM.[USER_ID] -- 시도 (서울,경기,부산) , 시도별 유저수 그후 시도,사도별유저수로 묶기위해 group by FROM USER_MASTER UM (NOLOCK) JOIN USER_PERSONAL UP (NOLOCK) ON UP.[USER_ID] = UM.[USER_ID] LEFT JOIN ZIPCODE Z (NOLOCK) ON Z.ZIP_CD = REPLACE(UM.ZIP_CD, '-', '') -- 우편번호 테이블을 가져온다 유저마스터의 zip 조건으로 WHERE UM.USER_FG IN ('1', '2') AND Z.COUNTY IS NOT NULL GROUP BY Z.COUNTY, UM.[USER_ID] ) AS T GROUP BY T.COUNTY ORDER BY 1 | cs |
우편번호 테이블의 기본주소 유저 마스터 기본주소 를 키값으로 LEFT 조인 시켜준다
그후 시도, 시도별 유저수를 select 시켜준다
하지만....
총회원값 과 가져온 회원수가 일치하지 않는 것이었다 ..
아무래도 회원가입을 할때 Validate 가 제대로 되지않은거 같다... 몇가지 샘플을 찾아보니 맨앞에 공백이 들어가있는 컬럼도 몇개있었다..
그래서 생각한것이 주소지 앞에 2자리만 추출을 하는것이었다
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | /* 주소지 텍스트로 시도추출로 추출() */ SELECT T.COUNTY, COUNT(T.[USER_ID]) AS CNT INTO #ADDRESS2 FROM ( SELECT Z1.COUNTY, UM.[USER_ID] FROM USER_MASTER UM (NOLOCK) JOIN USER_PERSONAL UP (NOLOCK) ON UP.[USER_ID] = UM.[USER_ID] LEFT JOIN SYS_ZIPCODE Z (NOLOCK) ON Z.ZIP_CD = REPLACE(UM.ZIP, '-', '') LEFT JOIN (SELECT SIDO FROM SYS_ZIPCODE (NOLOCK) GROUP BY SIDO) Z1 ON Z1.SIDO = LEFT(LTRIM(UM.ADDR1), 2) --앞에 2자리 (서울,경기) 만 추출 WHERE UM.USER_FG IN ('1', '2') AND Z.ZIP_CD IS NULL AND Z1.COUNTY IS NOT NULL GROUP BY Z1.COUNTY, UM.[USER_ID] ) AS T GROUP BY T.COUNTY ORDER BY 1 | cs |
이렇게 추출한 2개의 쿼리문을 임시테이블에 INSERT 시킨후
1 2 3 4 5 6 7 8 | /* 정상우편번호 + 주소지 텍스트 추출 회원*/ SELECT T.SIDO, SUM(CNT) AS CNT FROM ( SELECT SIDO, CNT FROM #ADDRESS1 UNION ALL SELECT SIDO, CNT FROM #ADDRESS2 ) AS T GROUP BY T.SIDO | cs |
정상우편번호 + 주소지 에서 앞에 2자리만 추출한 테이블을 UNION ALL 시킨후 총합을 계산해
총회원과 비교를 해본후 정상을 확인해볼수 있다 ..
'ASP.NET MVC > SQL' 카테고리의 다른 글
MSSQL :: 1 Join (0) | 2017.01.13 |
---|---|
MSSQL :: 0 CURSOR (0) | 2016.12.01 |
WRITTEN BY