SQL/solvesql Advent of SQL 2024

[SQL] solvesql Advent of SQL 2024 13일차

주댕이 2024. 12. 13. 23:50

# 링크

 

https://solvesql.com/collections/advent-of-sql-2024/

 

solvesql.com

 

https://solvesql.com/problems/main-platform-of-game-developers/

 

solvesql.com

 

# 풀이

WITH PlatformSales AS (
  SELECT 
    c.name AS developer,
    p.name AS platform,
    SUM(g.sales_na + g.sales_eu + g.sales_jp + g.sales_other) AS total_sales
  FROM games g
  JOIN companies c
  ON g.developer_id = c.company_id
  JOIN platforms p
  ON g.platform_id = p.platform_id
  GROUP BY developer, platform
),
MaxSales AS (
  SELECT
    developer,
    MAX(total_sales) AS max_sales
  FROM PlatformSales
  GROUP BY developer
)
SELECT
  ps.developer,
  ps.platform,
  ps.total_sales AS sales
FROM PlatformSales ps
JOIN MaxSales ms
ON ps.developer = ms.developer
  AND ps.total_sales = ms.max_sales
  • PlatformSales CTE
    • SELECT
      • c.name AS developer: companies 테이블의 name 컬럼을 선택하고, developer로 저장한다.
      • p.name AS platform: platforms 테이블의 name 컬럼을 선택하고, platform으로 저장한다.
      • SUM(g.sales_na + g.sales_eu + g.sales_jp + g.sales_other) AS total_sales: games 테이블의 sales_na, sales_eu, sales_jp, sales_other 컬럼을 모두 더하고, total_sales로 저장한다.
    • FROM games g: games 테이블의 별칭을 g로 설정하고, 해당 테이블에서 데이터를 불러온다.
    • JOIN companies c ON g.developer_id = c.company_id: companies 테이블의 별칭을 c로 설정하고, games 테이블의 developer_id와 companies 테이블의 company_id를 기준으로 games 테이블과 companies 테이블을 조인한다.
    • JOIN platforms p ON g.platform_id = p.platform_id: platforms 테이블의 별칭을 p로 설정하고, games 테이블의 platform_id와 platforms 테이블의 platform_id를 기준으로 games 테이블과 platforms 테이블을 조인한다.
    • GROUP BY developer, platform: developer와 platform을 기준으로 그룹화한다.
  • MaxSales CTE
    • SELECT
      • developer: developer 컬럼을 선택한다.
      • MAX(total_sales) AS max_sales: total_sales의 최댓값을 계산하여 max_sales로 저장한다.
    • FROM PlatformSales: PlatformSales 테이블에서 데이터를 불러온다.
    • GROUP BY developer: developer를 기준으로 그룹화한다.
  • SELECT
    • ps.developer: PlatformSales 테이블의 developer 컬럼을 선택한다.
    • ps.platform: PlatformSales 테이블의 platform 컬럼을 선택한다.
    • ps.total_sales AS sales: PlatformSales 테이블의 total_sales 컬럼을 sales로 저장한다.
  • FROM PlatformSales ps: PlatformSales 테이블의 별칭을 ps로 설정하고, 해당 테이블에서 데이터를 불러온다.
  • JOIN MaxSales ms ON ps.developer = ms.developer  AND ps.total_sales = ms.max_sales: MaxSales 테이블의 별칭을 ms로 설정하고, PlatformSales 테이블과 MaxSales 테이블의 developer, PlatformSales 테이블의 total_sales와 MaxSales 테이블의 max_sales를 기준으로 PlatformSales 테이블과 MaxSales 테이블을 조인한다.

 

728x90