[강의명]
패스트캠퍼스 SQL 100제 + 자격증 완성 온라인 완주반
[수강목록]
생각대로 SQL - 7
[강의내용]
생각대로 SQL - 7
문제3번) 국가(country)별 도시(city)별 매출액, 국가(country)매출액 소계 그리고 전체 매출액을 구하세요. (grouping set)
먼저 SELECT절에 어떤 컬럼을 써야할지 생각하면 문제를 풀기 쉽다.
첫번째로 와야하는 컬럼은 country, 두번째는 city, 세번째는 sum(amount)가 될 것같다.
SELECT country, city, sum(amount)
FROM payment p
JOIN customer c ON p.customer_id = c.customer_id
JOIN address a ON c.address_id = a.address_id
JOIN city ci ON a.city_id = ci.city_id
JOIN country co ON ci.country_id = co.country_id
GROUP BY GROUPING SETS (
(country, city),
(country),
()
)
ORDER BY country, city;
CUBE는 실무에서 잘 쓰이지 않는다고 한다.
(아마 GROUP BY 3개컬럼, 4개컬럼... 늘어나면 기준 수가 2의 N승으로 크게 증가하기 때문에
불필요한 컬럼기준도 함께 출력되어서 그런 것 같다)
문제4번) 국가(country)별 도시(city)별 매출액, 국가(country)매출액 소계 그리고 전체 매출액을 구하세요. (rollup)
3번과 같은 문제인데 이번엔 ROLLUP을 사용해본다.
ROLLUP은 GROUPING SETS처럼 기준 컬럼의 집합을 일일히 넣어줄 필요가 없고,
SELECT 절의 첫번째 컬럼 중심으로 소계 및 전체합계가 구해진다.
SELECT country, city, sum(amount)
FROM payment p
JOIN customer c ON p.customer_id = c.customer_id
JOIN address a ON c.address_id = a.address_id
JOIN city ci ON a.city_id = ci.city_id
JOIN country co ON ci.country_id = co.country_id
GROUP BY ROLLUP (country, city)
ORDER BY country, city;
쿼리 결과는 3번과 동일하다.
문제5번) 영화배우별로 출연한 영화 count수와, 모든 배우의 전체 출연영화 수를 합산해서 함께 보여주세요.
SELECT actor_id, count(film_id) ...
전체 합계도 구해야 한다.
GROUPING SETS, ROLLUP 둘 다 풀 수 있다.
[GROUPING SETS]
SELECT actor_id, count(DISTINCT film_id)
FROM film_actor fa
GROUP BY GROUPING SETS (
(actor_id),
()
);
[ROLLUP]
SELECT actor_id, count(DISTINCT film_id)
FROM film_actor fa
GROUP BY ROLLUP (actor_id);
결과는 동일하다.
문제7번) 영화에서 사용한 언어와 영화 개봉연도에 대한 영화 갯수와, 영화 개봉연도에 대한 영화 갯수를 함께 보여주세요.
language별 + release_year별 합계
release_year별 합계를 구해야 한다.
SELECT name, release_year, count(film_id)
FROM language l
JOIN film f ON l.language_id = f.language_id
GROUP BY GROUPING SETS (
(name, release_year),
(release_year)
)
ORDER BY l.name;
film 테이블의 language는 모두 English이고, release_year는 모두 2006년이라 이런 결과가 나온다.
문제9번) 지점별, active별 고객의 수와, active별 고객 수를 함께 보여주세요.
지점과, active 여부에 대해서는 customer 테이블을 이용하여 보여주세요.
- grouping sets를 이용해서 풀이해주세요.
store_id별 + active별 합계,
active별 합계를 구하면 된다.
SELECT store_id, active, count(customer_id)
FROM customer
GROUP BY GROUPING SETS (
(store_id, active),
(active)
)
ORDER BY store_id, active;