CASE WHEN

ietgou·2024년 8월 2일

im_sql

목록 보기
3/5

두번째로 CASE WHEN 이다.

CASE WHEN

CASE WHEN 절은 SQL에서 조건문을 작성할 때 사용됩니다. 주어진 조건에 따라 다른 값을 반환할 수 있습니다.

CASE WHEN 절의 주요 특징

  • 조건 분기: 여러 조건을 지정하고, 각 조건에 따라 다른 값을 반환할 수 있습니다.
  • 가독성 향상: 복잡한 조건을 명확하게 표현할 수 있습니다.

WITH절 설명글에서 사용했던 예제인데, 예제를 통해 알아보자.

Input: 
Activity table:
+------------+------------+---------------+-----------+
| machine_id | process_id | activity_type | timestamp |
+------------+------------+---------------+-----------+
| 0          | 0          | start         | 0.712     |
| 0          | 0          | end           | 1.520     |
| 0          | 1          | start         | 3.140     |
| 0          | 1          | end           | 4.120     |
| 1          | 0          | start         | 0.550     |
| 1          | 0          | end           | 1.550     |
| 1          | 1          | start         | 0.430     |
| 1          | 1          | end           | 1.420     |
| 2          | 0          | start         | 4.100     |
| 2          | 0          | end           | 4.512     |
| 2          | 1          | start         | 2.500     |
| 2          | 1          | end           | 5.000     |
+------------+------------+---------------+-----------+
Output: 
+------------+-----------------+
| machine_id | processing_time |
+------------+-----------------+
| 0          | 0.894           |
| 1          | 0.995           |
| 2          | 1.456           |
+------------+-----------------+

테이블만 가져왔다. 전체 문제는 WITH 절 본문으로!

아무튼 요 테이블에서 process_time, 즉 생산 시간을 구하려면 어떻게 해야할까? end - start를 하면 시간을 구할 수 있을 것이다.
이럴때 case when을 사용해보자.

먼저 SELECT로 machine_in, process_id는 가져오고.

MAX를 먼저 걸어서 가장 큰놈을 가져오자. 사실 이문제에서는 MAX를 걸지 않아도 머신 id와 프로세스 id가 하나씩 있어서 상관없긴 하다. 대신 CASE WHEN만 걸면 안된다고 하니까 SUM이라도 걸어야함.
(왜 안되는지는 자세히 알아보고 이해한후에 추가 포스팅하자)

그런 후에 CASE WHEN을 사용해서 activity_type이 end인지 start 확인하고,

timestamp를 가져오자. 그런 후에 else는 null로 주고 end.

SELECT 
    machine_id,
    process_id,
    MAX(CASE WHEN activity_type = 'end' THEN timestamp ELSE NULL END) -
    MAX(CASE WHEN activity_type = 'start' THEN timestamp ELSE NULL END) AS process_time
FROM Activity
GROUP BY machine_id, process_id;

이렇게 해서 예제 확인 완료.

join으로 푸는게 훨씬 효율적이긴 한데 gpt가 풀이해준 김에 with과 casewhen을 더 깊게 알아봤다. 럭키비키잖앙

0개의 댓글