반응형

 

여러 가지 컬럼이 있는 테이블에서

넘버링(ex. num/idx 등등)되는 컬럼이 아닌, 다른 컬럼에 대해 ORDER BY 하는 경우가 종종 있다.

 

그때, ORDER BY 구문에서 CASE문을 적절하게 사용하면

여러 컬럼을 동시에 제어할 수 있다.

 

예제를 보면서 차근차근 알아가 보자.

 

테스트 예제

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
33
34
35
CREATE TABLE #MEMBER(
    num            INT IDENTITY PRIMARY KEY,
    name        NVARCHAR(20),
    age            INT,
    height        INT,
    [weight]    INT
)
 
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('홍길동'1720170);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('이영표'3515065);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('박찬호'4718489);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('박지성'5417670);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('이순신'24189100);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('박세리'4916752);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('류현진'3418295);
 
SELECT *
FROM #MEMBER
 
DECLARE @type TINYINT;
 
/*
type
1 : age (나이)
2 : height (키)
3 : weight (몸무게)
*/
 
SET @type = 1;
 
SELECT *
FROM #MEMBER
ORDER BY CASE @type WHEN 1 THEN age
                    WHEN 2 THEN height
                    WHEN 3 THEN [weight] END;
cs

 

테스트 데이터를 넣고,

@type이라는 변수를 선언하고 해당 변수에 따라서 정렬 방법이 달라지는 코드를 작성했다.

 

 

 

@type 변수에 따라서, 정렬이 아주 잘 된다.

하지만 오름차순(Ascending)만 된다는 것이 흠이다.

내림차순(Descending)이 필요할 때에는 어떻게 해야 할까?

 

아쉽게도 ASC / DESC는 CASE 문에서 사용할 수 없다.

그렇지만 방법은 있다.

 

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
DECLARE @type TINYINT,
        @sort TINYINT;
 
/*
type
1 : age (나이)
2 : height (키)
3 : weight (몸무게)
 
sort
1 : 오름차순 (Ascending)
2 : 내림차순 (Descending)
*/
 
SET @type = 3;
SET @sort = 1;
 
SELECT *
FROM #MEMBER
ORDER BY CASE WHEN @sort = 1 THEN (
                CASE @type WHEN 1 THEN age
                           WHEN 2 THEN height
                           WHEN 3 THEN [weight] END ) END ASC,
         CASE WHEN @sort = 2 THEN (
                CASE @type WHEN 1 THEN age
                           WHEN 2 THEN height
                           WHEN 3 THEN [weight] END ) END DESC;
cs

 

@sort라는 변수를 추가해주었고,

해당 변수가 오름차순인지 내림차순인지 판단해준다.

 

그리고 기존에 만들어 놨던 CASE 문을

CASE WHEN @sort = 1 THEN / CASE WHEN @sort = 2 THEN에 똑같이 넣어놨다.

마지막에 ASC / DESC를 설정해주었다.

 

 

 

정확하게 우리가 원하는 결과가 나왔다.

ORDER BY는 랭크 함수에서 사용된다. 당연히 랭크함수 OVER 내에서도 CASE 문이 사용 가능하다.

랭크함수에 대해서도 아래 링크를 걸어두니, 랭크 함수도 배워보자.

 

2019/12/04 - [개발/MSSQL] - [SQL] ROW_NUMBER, RANK, DENSE_RANK 차이점

 

[SQL] ROW_NUMBER, RANK, DENSE_RANK 차이점

데이터들을 그룹화시켜, 순서를 매기는 방법이 3가지가 있다. ROW_NUMBER RANK DENSE_RANK 역시나 3가지가 있는 것으로 보아, 3가지 모두 다른 성격의 랭크 함수라고 생각이 든다. 샘플을 통해서 테스트를 해보면..

im-first-rate.tistory.com

2020/01/29 - [개발/MSSQL] - [SQL] 랭크함수와 PARTITION BY를 이용하여 1등만 뽑아보자.

 

[SQL] 랭크함수와 PARTITION BY를 이용하여 1등만 뽑아보자.

SQL에서 랭크 함수는 많이 사용된다. ROW_NUMBER, RANK, DENSE_RANK가 대표적인 랭크 함수인데, 차이점은 아래 글을 참고하자. 2019/12/04 - [개발/MSSQL] - [SQL] ROW_NUMBER, RANK, DENSE_RANK 차이점 [SQL] ROW..

im-first-rate.tistory.com

 

반응형

+ Recent posts