Yours Ever, Data Chronicles

SQL 중첩된 CASE WHEN 구문 활용: 삼각형의 타입 구분하기 본문

Skillset/SQL

SQL 중첩된 CASE WHEN 구문 활용: 삼각형의 타입 구분하기

Everly. 2022. 8. 9. 13:23
Q. 다음과 같은 TRIANGLES 테이블이 있다고 하자.
각 컬럼인 A, B, C는 한 삼각형의 세 변의 길이를 의미한다.
이 정보를 활용하여 해당 삼각형이 어떤 종류의 삼각형인지를 구분하여라. (문제 바로가기)

'TRIANGLES' 테이블

 

삼각형의 타입은 다음과 같은 조건으로 나눈다.

  • 삼각형의 세 변의 길이가 모두 동일한 경우: Equilateral
  • 삼각형의 세 변 중 두 변의 길이가 동일한 경우: Isosceles
  • 삼각형의 세 변의 길이가 모두 다른 경우: Scalene
  • ★ 다만 가장 긴 변이 나머지 두 변의 합보다 작다면 그건 삼각형이라고 할 수 없다.
    (예를 들어 C가 가장 긴 변인데, A와 B의 합이 C보다 작으면 Not A Triangle)

 

예를 들어 TRIANGLES 테이블의 값이 다음과 같다고 하자.

 

  • 첫 행은 Isosceles 이다. 그 이유는 세 변 중에 두 변의 길이만 같으므로.
  • 두번째 행은 Equilateral 이다. 세 변의 길이가 모두 같으므로.
  • 세번째 행은 Scalene 이다. 세변의 길이가 모두 다르기 때문.
  • 마지막 행은 삼각형이라고 할 수 없다. 그 이유는 가장 긴 변인 30이 나머지 둘의 합 13+14=27보다도 작기 때문이다.

 

그래서 결과는 다음과 같이 나와야 한다.

Isosceles
Equilateral
Scalene
Not A Triangle

 


SQL 쿼리 답안

우선 결과물로는 삼각형의 타입이 나와야 하므로 CASE WHEN 구문을 써야 한다는 것을 바로 알았을 것이다.

(참고로 CASE WHEN 구문이 무엇인지 모르겠다면 이 포스팅에 아주 자세히 설명했으므로 참고하면 좋다!)

 

SQL CASE WHEN 구문 사용법 - 예제로 알아보기

오늘은 SQL에서 매우 자주 쓰이는 CASE WHEN 구문에 대해 포스팅합니다. CASE WHEN 구문은 SELECT절에 쓰이며, 대표적으로 2가지의 쓰임새가 있는데요! 1) 새로운 열을 생성하는 경우 SELECT CASE WHEN 기존 열

suy379.tistory.com

 

다만 여기서는 연산자를 사용한 조건문을 쓰는 부분이 좀 까다롭기 때문에 따로 포스팅 하였다.

 

처음에는 곧바로 A, B, C의 변이 같으냐 다르냐로 조건문을 썼는데,

이 문제의 핵심은 "각 행이 삼각형이 되는가?" 부터 검사해야 한다.

 

앞에서 가장 긴 변이 나머지 두 변의 합보다 작다면 삼각형이 되지 않는다고 하였다.

그래서 CASE WHEN을 활용해 가장 긴 변이 나머지 두 변의 합보다 큰 것만 갈라내고, 그게 아니라면(ELSE) 삼각형이 아니라고 반환한다.

그리고 전자에 대해 세부적인 조건문을 쓴다. 

내가 푼 답안은 다음과 같다.

 

SELECT CASE WHEN A+B>C AND A+C>B AND B+C>A THEN
            CASE WHEN A=B AND B=C THEN 'Equilateral'
                WHEN A<>B AND B<>C AND A<>C THEN 'Scalene'
                ELSE 'Isosceles' 
                END
        ELSE 'Not A Triangle' END
FROM TRIANGLES

 

  • 가장 첫번째 문에서 두 변의 합이 나머지 변보다 더 큰 경우(삼각형인 경우)만 걸러낸다.
    • 여기에서 중첩된 CASE WHEN 문을 사용해 A, B, C 세 변이 모두 같으면 Equilateral
    • A, B, C 세 변이 모두 다르면 Scalene
    • 나머지(ELSE)는 Isosceles
  • 가장 첫번째 문에서 걸러지지 않았다면(ELSE) 삼각형이 아니므로 Not A Triangle

 

여기서 주의할 점은 A, B, C 세 변이 모두 같다고 A=B=C라고 쓰면 안 된다.

또한 A, B, C 세변이 모두 다르다고 A<>B<>C라고 쓰면 안 된다는 점이다. (특히 이 케이스는 A와 B는 다르고, B와 C는 다른데 A와 C는 같을 수도 있으므로) 

 


참고로 Isosceles를 조건에 넣고 ELSE를 Scalene로 넣는 식으로 쿼리를 짤 수도 있다.

 

SELECT CASE WHEN A+B>C AND A+C>B AND B+C>A THEN
            CASE WHEN A=B AND B=C THEN 'Equilateral'
                WHEN A=B OR B=C OR A=C THEN 'Isosceles'
                ELSE 'Scalene' 
                END
        ELSE 'Not A Triangle' END
FROM TRIANGLES

 

결과 화면

반응형