여러 가지 컬럼이 있는 테이블에서
넘버링(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('홍길동', 17, 201, 70);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('이영표', 35, 150, 65);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('박찬호', 47, 184, 89);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('박지성', 54, 176, 70);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('이순신', 24, 189, 100);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('박세리', 49, 167, 52);
INSERT INTO #MEMBER (name, age, height, [weight]) VALUES('류현진', 34, 182, 95);
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
'개발 > MSSQL' 카테고리의 다른 글
[SQL] SELECT(조회)할 때, 컬럼 NVARCHAR(MAX)를 조심하자. (2) | 2020.03.06 |
---|---|
[SQL] 최소~최대 까지 랜덤 숫자 가져오기. (2) | 2020.02.17 |
[SQL] NULL체크 함수, ISNULL/COALESCE 알아보자. (0) | 2020.01.31 |
[SQL] 랭크함수와 PARTITION BY를 이용하여 1등만 뽑아보자. (4) | 2020.01.29 |
[SQL] 함수(Function)에 대해 알아보자. (1) | 2020.01.16 |