이 문제는 원래 JOIN 카테고리에 있는 문제이지만, JOIN으로 풀었을 때, 두 테이블간의 관계가 중복이 되는 문제와 둘 중 한 테이블이 비어 있을 경우에는 ON에 대한 부분에서 성립이 안되는 것 같아서, 간단하게 UNION ALL로 해결 했다.
다른 사람들의 JOIN 풀이 방법을 보았는데, 실제로는 TOTAL_ORDER의 SUM값이 중복되어 계산되는 경우들이 있어서 아직 JOIN으로의 해결은 완벽히 하지 못했다.
UNION ALL로 해결한 간단한 방법에 대해 소개한다.
UNION ALL
SQL의 집합 연산자 중 하나인데, 중복 레코드도 허용한다는 특징이 있다.
예시 테이블을 보면, 어찌되었던, FIRST_HALF에 있는 값도, JULY에 있는 값도 모두 더해져야 할 대상이다.
따라서 두 테이블의 중복 여부와 상관없이, 두 테이블의 모든 값을 한 테이블로 합쳐주어야 한다.
두 테이블의 컬럼들은 모두 동일하다. 그래서 더 쉽게 사용할 수 있다.
두 테이블을 합칠 때는 SELECT * FROM FIRST_HALF UNION ALL SELECT * FROM JULY 로 합칠 수 있다.
이렇게 합쳐진 하나의 테이블에서 필요한 컬럼들을 가져올 것인데, 조회를 하기 위해 필요한 FLAVOR와 SUM(TOTAL_ORDER)을 가져올 것이고, 이때 SUM을 FLAVOR별로 합쳐야 하기 때문에 GROUP BY FLAVOR를 해준다.
여기 까지 하면
SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDER_SUM
FROM (
(SELECT * FROM FIRST_HALF UNION ALL SELECT * FROM JULY)
)AS A
GROUP BY FLAVOR
이다.
중간 중간 AS로써 컬럼의 이름과 조회 테이블의 이름을 지정해주었다.
이제 FLAVOR와 각 FLAVOR마다의 총 ORDER로 구성된 테이블은 구해졌다.
이 테이블에서 최종으로 조회해야 할 상위 FLAVOR 3개를 출력하면 끝이다.
상위 FLAVOR는 ORDER합의 큰 것부터 이므로, 합을 기준으로 내림차순 해준다.
SELECT FLAVOR
FROM (
SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDER_SUM
FROM (
(SELECT * FROM FIRST_HALF) UNION ALL (SELECT * FROM JULY)
) AS A
GROUP BY FLAVOR
) AS B
ORDER BY TOTAL_ORDER_SUM DESC
그리고 상위 3개만 구하면 끝이므로, MYSQL에서 지원하는 LIMIT 을 통해 상위 3개만 조회한다.
SELECT FLAVOR
FROM (
SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDER_SUM
FROM (
(SELECT * FROM FIRST_HALF) UNION ALL (SELECT * FROM JULY)
) AS A
GROUP BY FLAVOR
) AS B
ORDER BY TOTAL_ORDER_SUM DESC
LIMIT 3;
최종 코드를 한번 더 첨부한다.
SELECT FLAVOR
FROM (
SELECT FLAVOR, SUM(TOTAL_ORDER) AS TOTAL_ORDER_SUM
FROM (
(SELECT * FROM FIRST_HALF) UNION ALL (SELECT * FROM JULY)
) AS A
GROUP BY FLAVOR
) AS B
ORDER BY TOTAL_ORDER_SUM DESC
LIMIT 3;
JOIN방법을 찾는 다면 다음 편에 이어서 작성하겠다
'CO-TE > 프로그래머스' 카테고리의 다른 글
[프로그래머스] JAVA / c++ LV2 전화번호 목록 / 해시알고리즘, SORT 풀이 (2) (0) | 2023.10.18 |
---|---|
[프로그래머스] JAVA / c++ LV2 전화번호 목록 / 해시알고리즘, SORT 풀이 (1) (1) | 2023.10.18 |
[프로그래머스] c++ LV2 타겟 넘버 / DFS 알고리즘 사용 (0) | 2023.10.17 |
[프로그래머스] MYSQL LV2 조건에 맞는 도서와 저자 리스트 출력하기 / 풀이방법 (1) | 2023.10.17 |
[프로그래머스] c++ LV2 택배 배달과 수거하기 (2023 KAKAO BLIND RECRUITMENT) 풀이/접근 방식 (0) | 2023.10.12 |