안녕하세요 .. 요새 직장에 다시 들어가서 정신없이 배우느라 포스팅할 시간이없어서 주말동안에 회사에서 배운것을 정리할겸 포스팅을 할계획입니다  (_ _) 



회사업무 특성상 집계, 카운팅을 자주 하게되는데 오늘 배운 쿼리를 공부 할겸 다시보기 해보려고한다


클라이언트의 요구사항은 이것이었다 


일반회원중 등급 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
내가달이다

,