HackerRank Intermediate
- The PADS
👉 문제 바로가기(HackerRank)
-- 풀이1. 테이블 병합하여 한번에 출력
SELECT col
FROM (
SELECT CONCAT(NAME, '(', LEFT(Occupation,1), ')') AS col,
1 AS sort_order,
NAME AS sort_value,
NULL AS cnt,
NULL AS occ
FROM OCCUPATIONS
UNION ALL
SELECT CONCAT('There are a total of ', COUNT(*), ' ', LOWER(Occupation), 's.') AS col,
2 AS sort_order,
NULL AS sort_value,
COUNT(*) AS cnt,
Occupation AS occ
FROM OCCUPATIONS
GROUP BY Occupation
) AS combined_result
ORDER BY sort_order, cnt, occ, sort_value;
-- 풀이2. 테이블 병합하지 않고 각자 출력
SELECT Name, CONCAT(NAME,'(',LEFT(Occupation,1),')') as col
FROM OCCUPATIONS
ORDER BY col;
SELECT CONCAT('There are a total of ',COUNT(*),' ', LOWER(Occupation),'s.') as col
FROM OCCUPATIONS
GROUP BY Occupation
ORDER BY COUNT(*), Occupation;
[문제 상황]
- 서로 다른 테이블의 결과를 한번에 출력해야 한다.
- 각 테이블별 정렬이 필요한데 Union All을 통해 출력하면 테이블별로 정렬 기준을 적용시킬 수 없다.(서브쿼리 내의 정렬은 적용X)
- UNION ALL 이후 최종 정렬을 지정하지 않으면, 데이터베이스 엔진이 결과를 예측할 수 없는 순서로 반환할 수 있음
[해결]
방법 1
- 각 테이블 별로 정렬 순서를 적용할 테이블 순서를 나타내는 컬럼과, 정렬 기준이 되는 컬럼을 생성한다.
- UNION 하기 위해서는 각 테이블의 컬럼명과 개수가 똑같아야 하므로, 정렬 기준이 적용 되지 않는 테이블에는 정렬 기준으로 생성한 컬럼의 컬럼값을 NULL로 입력한다.
- UNION 수행
- 최종 정렬로 생성한 정렬 순서와 정렬 기준을 적용시킨다.
방법 2
- 각 테이블의 정렬까지 완료하여 테이블 별로 원하는 결과를 출력하는 쿼리를 작성한다.
- 각 쿼리 마지막에 세미콜론(;)을 붙여 각 쿼리가 개별적으로 실행되도록 한다.
- 테이블이 병합되지 않은채로 각각의 쿼리의 결과값이 출력된다.
[회고]
- UNION을 통해 하나의 테이블로 병합할 때, 컬럼명이 같아야한다는 것을 알게 되었다.
- UNION을 사용할 때, 병합하는 각 테이블 별로 결과를 정렬하려면 정렬 순서 컬럼, 정렬 기준 컬럼을 추가로 생성해서 최종 정렬 ORDER BY절에 작성하여 원하는 결과를 얻을 수 있음을 알게 되었다.
- 각 쿼리를 합치지 않고 결과를 출력하려면 각 쿼리 끝에 세미콜론(;)으로 맺어주면 된다는 사실을 알게 되었다.
'DA Study > TIL' 카테고리의 다른 글
[TIL] SELECT절에서 서브쿼리 활용하여 비율 구하기 # MySQL # SQL (0) | 2025.02.04 |
---|---|
[TIL] 조건절에서 서브쿼리 활용하기 # MySQL # SQL (4) | 2025.02.01 |
[TIL] subplot으로 두 개의 그래프 한 figure에 그리기 # python # 부트캠프 (1) | 2025.01.23 |
[TIL] MySQL 정규식 REGEXP AND, OR 조건 # MySQL # SQL (1) | 2025.01.22 |
[TIL] MySQL 정규식 REGEXP (Regular Expression) # MySQL # SQL (0) | 2025.01.19 |