반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- 업무 자동화
- javascript
- .NET Core
- Visual Studio 강제 삭제
- 웹 자동화
- Vue configureWebpack
- Selenium 환경
- vue
- Selenium 설치
- Tomcat Error
- vue3
- Visual Studio 2015 설치
- vue.js
- 프록시 예제
- MSSQL 문자열
- 리버스 프록시 예제
- Visual Studio 2015 강제 삭제
- SQLP
- tomcat
- MSSQL 동적 쿼리
- Vue3 configureWebpack
- Visual Studio 2015 삭제
- Nginx Reverse Proxy
- 디자인 패턴 사례
- spring
- 웹 크롤링
- Visual Studio 패키지에 실패했습니다.
- Vue.config
- Visual Studio 재설치
- .NET Core Proxy
Archives
- Today
- Total
금백조의 개발 블로그
[MSSQL]SELECT, WHERE, ORDER BY절에서 CASE문 활용하기(SELECT CASE, WHERE CASE, ORDER BY CASE) 본문
Database/SQL Server(MSSQL)
[MSSQL]SELECT, WHERE, ORDER BY절에서 CASE문 활용하기(SELECT CASE, WHERE CASE, ORDER BY CASE)
금백조 2021. 3. 28. 10:32반응형
서론
개발을 진행하면서 SELECT, WHERE, ORDER BY절에서 CASE문을 통해 원하는 데이터를 추출했던 경험들이 있었습니다. 오늘은 그동안 사용해봤던 경험들을 토대로 SELECT, WHERE, ORDER BY절에서 CASE문을 활용하는 방법을 예제를 통해 소개해보겠습니다.
본론
[구문 형식]
[SELECT CASE]
SELECT CASE WHEN [조건식1] THEN [결과식1]
WHEN [조건식2] THEN [결과식2]
...
ELSE [조건식N] END
[WHERE CASE]
SELECT ...
FROM ...
WHERE CASE WHEN [조건식1] THEN 1
WHEN [조건식2] THEN 1
...
ELSE 0 END = 1
[ORDER BY CASE]
SELECT ...
FROM ...
WHERE ...
ORDER BY CASE [삽입식] WHEN [조건식1] THEN [결과식1]
WHEN [조건식2] THEN [결과식2]
...
ELSE [결과식N] END
[특징]
[SELECT CASE] : WHEN에 적은 조건식에 따라 결과식을 다르게 조회할 수 있습니다.
[WHERE CASE] : 다중 조건식을 써야 할 경우 CASE문을 통해 간결하고 직관적으로 표현이 가능합니다.
[ORDER BY CASE] : 특정 행에 대해서 정렬이 따로 필요할 경우 CASE문을 통해 구현할 수 있습니다.
[SELECT CASE 예제]
--SELECT절에서 CASE문 활용 예제
SELECT N'C001' AS CLASS_CODE, N'알고리즘' AS CLASS_NAME, 100 AS SCORE
INTO #TEMP_TABLE
UNION ALL
SELECT N'C002' AS CLASS_CODE, N'자료구조' AS CLASS_NAME, 80 AS SCORE
UNION ALL
SELECT N'C003' AS CLASS_CODE, N'JAVA' AS CLASS_NAME, 60 AS SCORE
UNION ALL
SELECT N'C004' AS CLASS_CODE, N'C#' AS CLASS_NAME, 40 AS SCORE
UNION ALL
SELECT N'C005' AS CLASS_CODE, N'데이터베이스' AS CLASS_NAME, 20 AS SCORE
UNION ALL
SELECT N'C006' AS CLASS_CODE, N'네트워크' AS CLASS_NAME, 0 AS SCORE
UNION ALL
SELECT N'C007' AS CLASS_CODE, N'운영체제' AS CLASS_NAME, 99999 AS SCORE
--SELECT절에서 CASE문 활용
--조건식을 통해 각각의 학점(GRADE) 출력
SELECT
CLASS_CODE,
CLASS_NAME,
SCORE,
CASE WHEN SCORE > 100 OR SCORE < 0 THEN 'Z'--100초과 0미만인 에러 데이터는 Z 표시
WHEN SCORE >= 80 AND SCORE <= 100 THEN 'A'--80이상 100이하 = A
WHEN SCORE >= 60 AND SCORE < 80 THEN 'B'--60이상 80미만 = B
WHEN SCORE >= 40 AND SCORE < 60 THEN 'C'--40이상 60미만 = C
WHEN SCORE >= 20 AND SCORE < 40 THEN 'D'--20이상 40미만 = D
ELSE 'F' END AS GRADE--0이상 20미만 = F
FROM #TEMP_TABLE
[WHERE CASE 예제]
--WHERE절에서 CASE문 활용 예제
SELECT '과자' AS ITEM_GROUP ,N'단맛과자' AS ITEM, 100 AS SALES_QTY
INTO #TEMP_TABLE
UNION ALL
SELECT '과자' AS ITEM_GROUP ,N'쓴맛과자' AS ITEM, 10 AS SALES_QTY
UNION ALL
SELECT '과자' AS ITEM_GROUP ,N'짠맛과자' AS ITEM, 50 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'커피' AS ITEM, 150 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'우유' AS ITEM, 200 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'이온음료' AS ITEM, 300 AS SALES_QTY
--WHERE절에서 CASE문을 활용
--과자는 판매수량이 50이상이고 음료는 판매수량이 300이상인 데이터 추출
SELECT
ITEM_GROUP
,ITEM
,SALES_QTY
FROM #TEMP_TABLE
WHERE
CASE WHEN ITEM_GROUP = '과자' AND SALES_QTY >= 50 THEN 1
WHEN ITEM_GROUP = '음료' AND SALES_QTY >= 300 THEN 1
ELSE 0 END = 1
--아래의 OR 구문과 동일하게 동작
--(ITEM_GROUP = '과자' AND SALES_QTY >= 50)
--OR (ITEM_GROUP = '음료' AND SALES_QTY >= 300)
[ORDER BY CASE 예제]
--ORDER BY절에서 CASE문 활용 예제
SELECT '과자' AS ITEM_GROUP ,N'단맛과자' AS ITEM, 100 AS SALES_QTY
INTO #TEMP_TABLE
UNION ALL
SELECT '과자' AS ITEM_GROUP ,N'쓴맛과자' AS ITEM, 10 AS SALES_QTY
UNION ALL
SELECT '과자' AS ITEM_GROUP ,N'짠맛과자' AS ITEM, 50 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'커피' AS ITEM, 150 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'우유' AS ITEM, 200 AS SALES_QTY
UNION ALL
SELECT '음료' AS ITEM_GROUP ,N'이온음료' AS ITEM, 300 AS SALES_QTY
SELECT
CASE WHEN GROUPING(ITEM_GROUP)+GROUPING(ITEM)=2 THEN '총계'
WHEN GROUPING(ITEM_GROUP)+GROUPING(ITEM)=1 THEN ITEM_GROUP+'소계'
ELSE ITEM_GROUP END AS ITEM_GROUP
,ITEM
,SUM(SALES_QTY) AS SALES_QTY
FROM #TEMP_TABLE
GROUP BY ROLLUP (ITEM_GROUP, ITEM)
--ORDER BY절에서 CASE문 활용
--총계를 맨 위에 정렬되도록 출력
ORDER BY CASE GROUPING(ITEM_GROUP)+GROUPING(ITEM) WHEN 2 THEN '' ELSE 'Z' END, ITEM_GROUP
결론
CASE문은 SELECT, WHERE, ORDER BY절뿐만 아니라 SQL 모든 구문에서 활용할 수 있습니다. 따라서 CASE문에 대해 더 다양한 활용법을 알고 싶으신 분들은 아래의 [CASE(Transact-SQL)] 글에서 더욱 다양한 예제를 만나보실 수 있습니다.
Reference
[CASE(Transact-SQL)]
docs.microsoft.com/ko-kr/sql/t-sql/language-elements/case-transact-sql?view=sql-server-ver15
반응형
'Database > SQL Server(MSSQL)' 카테고리의 다른 글
[MSSQL]CROSS APPLY, OUTER APPLY 활용 및 예제(APPLY 연산자) (6) | 2021.03.31 |
---|---|
[MSSQL]EXCEPT를 이용한 차집합 구하기(MSSQL 차집합) (0) | 2021.03.30 |
[MSSQL]ISNUMERIC을 이용한 숫자, 문자 판단 및 주의사항 (0) | 2021.03.14 |
[MSSQL]SELECT INTO문을 통한 임시테이블 생성(SELECT INTO절) (0) | 2021.03.04 |
[MSSQL]PIVOT을 이용하여 세로를 가로로 변환 방법(행 열 변환) (4) | 2021.02.28 |