0Pricing
SQL Academy · 강의

ORDER BY와 집계에서의 CASE

조건부 정렬과 개수 세기를 알아봅니다.

ORDER BY와 집계에서의 CASE은(는) CoddyKit의 무료 SQL Academy 강의입니다. 이것은 4개 중 4번째 강의입니다. 아래에서 전체 강의를 무료로 읽을 수 있으며, 내장 코드 에디터와 24/7 AI 튜터와 함께 브라우저에서 직접 실습할 수 있습니다. 이 강의는 SQL Academy 학습 경로의 일부이며, 진행 상황이 웹과 CoddyKit 앱에 동기화됩니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

사용자 지정 우선순위로 정렬

SQL의 ORDER BY 절은 일반적으로 열의 자연스러운 값에 따라 행을 정렬합니다. 하지만 CASE 표현식을 ORDER BY 안에 넣어 완전히 사용자 지정된 정렬 순서를 만들 수 있습니다. 단일 열만으로는 만들 수 없는 순서입니다.

이 기법은 원시 데이터 값이 아니라 업무 규칙에 따라 우선순위가 결정될 때 유용합니다.

SELECT product_name, status
FROM products
ORDER BY
  CASE status
    WHEN 'urgent'   THEN 1
    WHEN 'active'   THEN 2
    WHEN 'pending'  THEN 3
    ELSE                 4
  END;

ORDER BY 안의 CASE 작동 방식

데이터베이스가 ORDER BY CASE ... END를 평가할 때 모든 행에 대해 정수 또는 다른 비교 가능한 값을 계산합니다. 그런 다음 행은 원시 열 대신 또는 원시 열과 함께 이 계산된 값을 기준으로 정렬됩니다.

CASE 표현식은 저장되지 않으며 쿼리가 실행되는 동안에만 존재합니다.

SELECT order_id, priority
FROM orders
ORDER BY
  CASE priority
    WHEN 'high'   THEN 1
    WHEN 'medium' THEN 2
    WHEN 'low'    THEN 3
    ELSE               9
  END,
  order_id;

NULL을 명시적으로 정렬하기

기본적으로 데이터베이스마다 정렬된 결과에서 NULL을 처음에 배치하거나 마지막에 배치하는 방식이 다릅니다. ORDER BY의 CASE를 사용하면 데이터베이스 엔진과 관계없이 NULL이 정확히 어디에 위치할지 결정할 수 있습니다.

SELECT employee_name, manager_id
FROM employees
ORDER BY
  CASE WHEN manager_id IS NULL THEN 0 ELSE 1 END,
  manager_id;

조건부 오름차순 및 내림차순

ORDER BY의 CASE는 조건부 정렬 방향을 흉내 내는 데도 사용할 수 있습니다. 범주 값을 음수에 매핑하면 특정 그룹의 정렬 순서를 사실상 반대로 바꾸면서 다른 그룹에는 일반적인 순서를 유지할 수 있습니다.

하나의 결과 집합에서 행 유형마다 서로 다른 정렬 논리가 필요할 때 유용합니다.

SELECT task_name, due_date, is_overdue
FROM tasks
ORDER BY
  CASE WHEN is_overdue = 1 THEN 0 ELSE 1 END,
  due_date;

COUNT 안에서 CASE 사용

COUNT와 같은 집계 함수 안에 CASE 표현식을 넣을 수 있습니다. 핵심은 세려는 행에는 NULL이 아닌 값을 반환하고, 건너뛸 행에는 NULL을 반환하는 것입니다. COUNT는 NULL을 무시하기 때문입니다.

SELECT
  COUNT(CASE WHEN status = 'active'   THEN 1 END) AS active_count,
  COUNT(CASE WHEN status = 'inactive' THEN 1 END) AS inactive_count
FROM users;

SUM 안에서 CASE 사용 — 조건부 합계

SUM 안에 CASE를 넣으면 조건이 참일 때만 값을 더하고, 일치하지 않는 행은 0으로 처리할 수 있습니다. 이는 하나의 열을 여러 측정값 열로 나누는 피벗 형태의 보고서에서 매우 흔히 사용하는 패턴입니다.

SELECT
  SUM(CASE WHEN region = 'North' THEN sales_amount ELSE 0 END) AS north_total,
  SUM(CASE WHEN region = 'South' THEN sales_amount ELSE 0 END) AS south_total,
  SUM(CASE WHEN region = 'East'  THEN sales_amount ELSE 0 END) AS east_total
FROM sales;

CASE를 사용한 조건부 AVG

같은 패턴을 AVG에도 적용할 수 있습니다. AVG는 NULL을 무시하므로 제외하려는 행에 NULL을 반환하면 일치하는 행만의 평균을 구할 수 있습니다. 서브쿼리도 필요하지 않습니다.

SELECT
  AVG(CASE WHEN department = 'Engineering' THEN salary END) AS avg_eng_salary,
  AVG(CASE WHEN department = 'Marketing'   THEN salary END) AS avg_mkt_salary
FROM employees;

CASE를 사용한 그룹화 — 행 버킷화

GROUP BY 또는 SELECT 목록에서 CASE를 사용하여 연속적인 값을 범주로 버킷화한 다음 각 버킷을 집계할 수 있습니다. 이렇게 하면 기본 데이터를 변경하지 않고 숫자 열을 레이블이 지정된 그룹으로 바꿀 수 있습니다.

SELECT
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END AS age_group,
  COUNT(*) AS user_count
FROM users
GROUP BY
  CASE
    WHEN age < 18             THEN 'Under 18'
    WHEN age BETWEEN 18 AND 35 THEN '18-35'
    WHEN age BETWEEN 36 AND 55 THEN '36-55'
    ELSE                            '56+'
  END;

별칭 사용과 CASE 반복 비교

SELECT와 GROUP BY에서 긴 CASE 표현식을 반복하면 장황해집니다. 일부 데이터베이스에서는(MySQL, 우회 방법을 사용하는 PostgreSQL) ORDER BY에서 별칭을 참조할 수 있지만 GROUP BY에서는 참조할 수 없습니다. 여러 데이터베이스에서 가장 안전하게 호환되는 방법은 쿼리를 서브쿼리 또는 CTE로 감싼 다음 그 안에서 별칭을 기준으로 GROUP BY를 수행하는 것입니다.

WITH scored AS (
  SELECT
    customer_id,
    CASE
      WHEN total_spent >= 1000 THEN 'Gold'
      WHEN total_spent >= 500  THEN 'Silver'
      ELSE                          'Bronze'
    END AS tier
  FROM customers
)
SELECT tier, COUNT(*) AS customer_count
FROM scored
GROUP BY tier
ORDER BY
  CASE tier
    WHEN 'Gold'   THEN 1
    WHEN 'Silver' THEN 2
    ELSE               3
  END;

ASC / DESC와 CASE 결합

CASE 표현식 뒤에 ASC 또는 DESC를 계속 추가할 수 있으며, 쉼표로 구분하여 정렬 열을 더 지정할 수도 있습니다. CASE 점수는 첫 번째 정렬 기준일 뿐이고, 이후 열은 일반적인 방식으로 동률을 해소합니다.

SELECT
  ticket_id,
  category,
  created_at
FROM support_tickets
ORDER BY
  CASE category
    WHEN 'billing'  THEN 1
    WHEN 'outage'   THEN 2
    WHEN 'feature'  THEN 3
    ELSE                 4
  END ASC,
  created_at ASC;

실제 사례 — 판매 대시보드

다음은 CASE 기반 집계와 CASE 기반 정렬을 결합한 현실적인 쿼리입니다. 지역별 판매 요약을 생성하며, 수익이 가장 높은 지역이 항상 맨 앞에 오도록 정렬하고 '기타'는 맨 아래로 보냅니다.

SELECT
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END AS region_label,
  SUM(CASE WHEN status = 'completed' THEN amount ELSE 0 END) AS completed_sales,
  COUNT(CASE WHEN status = 'refunded' THEN 1 END)           AS refund_count
FROM orders
GROUP BY
  CASE
    WHEN region IN ('North', 'South', 'East', 'West') THEN region
    ELSE 'Other'
  END
ORDER BY completed_sales DESC;

이해도 확인

ORDER BY와 집계 함수 안에서 CASE를 사용하는 방법을 제대로 이해했는지 확인해 보세요.

레슨 복습

이번 레슨에서는 CASE를 ORDER BY 및 집계 함수와 결합하는 방법을 배웠습니다.

  • ORDER BY의 CASE — 행에 사용자 지정 정렬 점수를 할당하고, NULL이 표시되는 위치를 제어하며, 하나의 쿼리에서 여러 정렬 규칙을 조합할 수 있습니다.
  • COUNT의 CASE — 포함할 행에는 NULL이 아닌 값을 반환하고, 건너뛸 행에는 암시적으로 또는 명시적으로 NULL을 반환합니다.
  • SUM / AVG의 CASE — ELSE 값으로 0 또는 NULL을 사용하여 한 번의 처리로 조건부 합계와 평균을 계산할 수 있습니다.
  • GROUP BY의 CASE — 연속형 값이나 범주형 값을 집계를 위한 이름이 지정된 그룹으로 묶을 수 있습니다.

이러한 패턴을 사용하면 많은 하위 쿼리를 없앨 수 있으며, 일반 SQL로 피벗 형태의 보고서를 쉽게 작성할 수 있습니다.

자주 묻는 질문

“ORDER BY와 집계에서의 CASE” 강의는 무료인가요?

네 — “ORDER BY와 집계에서의 CASE” 전체 내용을 이 웹사이트에서 무료로 읽을 수 있습니다. 인터랙티브하게 실습하려면(내장 코드 에디터와 24/7 AI 튜터), CoddyKit PRO로 업그레이드하면 SQL Academy 강의 전체를 잠금 해제할 수 있습니다. SQL Academy 강의에는 총 4개의 강의가 포함되어 있습니다.

“ORDER BY와 집계에서의 CASE”에서 뭘 배우나요?

조건부 정렬과 개수 세기를 알아봅니다. 브라우저에서 직접 실행하는 실습 코드로 SQL Academy을(를) 배우며, 24/7 AI 튜터가 강의를 진행하면서 질문에 답변해줍니다.

SQL Academy을(를) 시작하는 데 경험이 필요한가요?

사전 경험은 필요하지 않습니다. CoddyKit의 SQL Academy은(는) 초급자부터 고급 학습자까지를 위해 구성되어 있으므로, 여기서 시작하거나 처음부터 시작할 수 있으며 자신의 속도대로 진행할 수 있습니다. 이것은 4개 중 4번째 강의입니다.

“ORDER BY와 집계에서의 CASE” 강의는 얼마나 걸리나요?

대부분의 CoddyKit 강의는 약 5~10분이 소요됩니다. 각 강의는 간결하고 인터랙티브하여 꾸준한 진행이 가능하며, 웹과 앱에서 중단한 부분부터 바로 시작할 수 있습니다.

이 SQL Academy 강의에서 코드를 작성하고 실행할 수 있나요?

네. 모든 SQL Academy 강의에는 내장 코드 에디터가 포함되어 있으므로, 브라우저에서 바로 실제 코드를 작성하고 실행한 후 즉시 AI 피드백을 받을 수 있습니다 — 로컬 설정이 필요 없습니다.

이 강의의 모든 강의

  1. CASE 표현식
  2. 검색형 CASE와 단순 CASE
  3. 데이터 구간화와 레이블 지정
  4. ORDER BY와 집계에서의 CASE
← SQL Academy(으)로 돌아가기