본문 바로가기

Dev.../플밍 관련 자료

[펌] 이름별 소팅에 관한 SQL 쿼리

델마당(http://www.delmadang.com)에 올라온 글입니다.

 

----------------------------------------------------------------------------------------

내가 근무하는 회사의 직원 중 하나가 다음과 같은 SQL 쿼리 문제를 제기했다.

1. Customer라는 테이블에 cust_name라는 필드가 있다. 이 필드는 유니코드가 아닌 일반 문자열(varchar) 타입이다.

2. cust_name필드에는 거래처명이 입력되어 있는데, 이 거래처명이 ㄱ, ㄴ, ㄷ 등 각 초성으로 시작하는 거래처 수를 알고 싶다. 예를 들어 김말동은 'ㄱ' 범위이고 '홍길동'은 'ㅎ' 범위에 해당된다.

3. 각각의 한글 초성에 해당하는 거래처 이름 수를 표시하는, 다음과 같은 결과를 쿼리를 작성해야 한다.

 ㄱ   2324  -- 기역 범위 거래처 수
 ㄴ    213  -- 니은 범위 거래처 수
 ㄷ   1123
 ...
 ㅎ    423
 기타 3434

4. 순수 SQL 쿼리문으로 풀어야한다는 전제조건이 있다. 즉 일반 컴 언어(비베나 델파이같은)를 동원하여 파싱이나, 잘라내기를 하면 안된다는 것이다.

쉬울거 같으면서 만만치 않은 문제여서 여러분들과 함께 풀어보고자 한다.

----------------------------------------------------------------------------------------

가장 마음에(?) 드는 답변은 아래와 같다.

 

단계 1. 중복구문을 제거하기 위해 사용자 정의 함수를 추가한다.

CREATE FUNCTION [ChrCount] (@StartChr varChar(10), @EndChr varChar(10))  
RETURNS int AS  
BEGIN
declare @ReturnValue int
set @ReturnValue  = (select count(custom_name) from test_sort
   where custom_name >= @StartChr and custom_name < @EndChr)
return @ReturnValue
END

[이함수가 두 인자값을 받아서 실질적인 카운터를 한다.]

단계 2. SQL 쿼리 문을 작성한다.

select  'ㄱ',  dbo.ChrCount('ㄱ', 'ㄴ')
, 'ㄴ',  dbo.ChrCount('ㄴ', 'ㄷ')
, 'ㄷ',  dbo.ChrCount('ㄷ', 'ㄹ')
, 'ㄹ',  dbo.ChrCount('ㄹ', 'ㅁ')
, 'ㅁ',  dbo.ChrCount('ㅁ', 'ㅂ')
, 'ㅂ',  dbo.ChrCount('ㅂ', 'ㅅ')
, 'ㅅ',  dbo.ChrCount('ㅅ', 'ㅇ')
, 'ㅇ',  dbo.ChrCount('ㅇ', 'ㅈ')
, 'ㅈ',  dbo.ChrCount('ㅈ', 'ㅊ')
, 'ㅊ',  dbo.ChrCount('ㅊ', 'ㅋ')
, 'ㅋ',  dbo.ChrCount('ㅋ', 'ㅌ')
, 'ㅌ',  dbo.ChrCount('ㅌ', 'ㅍ')
, 'ㅍ',  dbo.ChrCount('ㅍ', 'ㅎ')
, 'ㅎ',  dbo.ChrCount('ㅎ', 'ㅎ???')
, 'a~z', dbo.ChrCount('a', 'z')

- 사용자 함수를 사용하면 요로코롬 이쁘게 쿼리문을 사용할수 있다.
- 사용자 함수는 SQL쿼리 문에서 호출할경우 DBUser명을 붙여서 호출하여야한다.
(반환값을 테이블 형식으로도 쓸수있다.)

장점)
1. SQL쿼리문을 이쁘게 만들수있다. (*^^*)
2. 남들이 안쓰는거쓰니 뽀대난다.( 주위에 이미 다들쓰고 있다면 대략 OTL)
3. 속도가 무진쟝 빠르다.. 일반 쿼리문 sp_procedure, view_Table 기타등등
어떤넘보다 속도가 빠르다..일반적인 모든 select 구문을 테이블 반환형의
사용자 함수로 대치가능하다..속도도 당근 무쟈게 빠르다..
.............그런데...왜 빠른지는 몰것다는점...