[SQL 3-3강 (1)] GROUP BY, GROUPING SET, ROLLUP, CUBE

2021. 5. 27.·🤓 기술 학습 & 공부 기록/컴퓨터 일반

[강의명]
패스트캠퍼스 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;

 

쿼리 결과

'🤓 기술 학습 & 공부 기록/컴퓨터 일반' 카테고리의 다른 글
  • [SQL 3-4강 (1)] LAG, LEAD, TO_CHAR, COUNT, RANK, OVER
  • [SQL 3-3강 (2)] AVG, ROW_NUMBER, RANK, DENSE_RANK, FIRST_VALUE, LAST_VALUE
  • [SQL 3-2강 (2)] GROUP BY, GROUPING SET, ROLLUP, CUBE
  • [SQL 3-2강 (1)] 서브쿼리, EXISTS, ANY, SELECT 1, NOT IN
지식물원
지식물원
지식이 자라는 식물원!
  • 지식물원
    지식물원
    지식물원
  • 전체
    오늘
    어제
    • 분류 전체보기 (510)
      • 🎨 프론트엔드 공부 (247)
        • JS & TS (86)
        • HTML & CSS (22)
        • React & Next (49)
        • Vue & Nuxt (22)
        • 기타 (68)
      • 🤓 기술 학습 & 공부 기록 (116)
        • Node.js (0)
        • Python (37)
        • 백엔드 (0)
        • 딥러닝 (1)
        • 컴퓨터 일반 (72)
        • 개발 인프라 (6)
      • 👨‍💻 프로젝트 경험 (6)
        • Work (0)
        • Toy (6)
      • ⚙️ 개발 팁 & 노하우 (21)
        • 프론트엔드 (6)
        • 기타 (15)
      • ☕️ 커리어 & 인터뷰 준비 (88)
        • 코딩 테스트 (88)
      • 📰 기술 트렌드 & 생각 정리 (4)
      • 📚 기타 (25)
        • 마케팅 (15)
        • 비개발서적 (10)
  • 블로그 메뉴

    • 태그
  • 링크

  • 공지사항

    • 모바일 접속 시 코드 하이라이팅 깨질 때
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
지식물원
[SQL 3-3강 (1)] GROUP BY, GROUPING SET, ROLLUP, CUBE
상단으로

티스토리툴바