DA Study/TIL

[TIL] 기증품 비율 계산하기 #SQL #ORACLE

harrym8n 2024. 12. 20. 17:46

solvesql - 기증품 비율 계산하기
👉 문제 바로가기(solvesql)

-- (ORACLE) 소장품 중 부분 기증품을 포함한 기증품의 비율이 얼마나 되는지 계산
-- 기증품의 비율은 백분율로 계산
-- 소수점 아래 넷째 자리에서 반올림 해 셋째 자리까지 표시 


-- 풀이1. with as 절로 테이블 2개 만들어서 비율 구하기
with
  gift_t as (
    SELECT
      COUNT(*) as data
    FROM
      artworks
    WHERE
      credit LIKE '%gift%'
  ),
  whole_t as (
    SELECT
      COUNT(*) as data
    FROM
      artworks
  )
SELECT
  ROUND(((
        CAST((SUM(IFNULL(t1.data, 0))) as float) / 
        SUM(IFNULL(t2.data, 0))) * 100),3) as ratio
FROM
  gift_t t1 FULL OUTER
  JOIN whole_t t2 ON t1.data = t2.data
  -- 풀이2. 단순 서브쿼리 이용
SELECT
  ROUND(
    ((
      (SELECT COUNT(*)
      FROM artworks
      WHERE credit LIKE '%gift%')*1.0 / COUNT(*))*100)
      ,3) as ratio
  FROM artworks

[ 논리 과정 ]
풀이 1

  1. 분모와 분자 테이블을 각각 만든다.
  2. 만든 테이블을 FULL OUTER JOIN을 통해 MERGE한다.
  3. MERGE한 테이블에서 각 열을 SUM하여 최종 분모 분자를 구한다.
  4. 3번에서 산출된 분모 분자를 나눠서 최종 결과를 구한다.

풀이 2

  1. SELECT 절에 서브쿼리로 분자를 산출한다.
  2. 본 쿼리에서 COUNT(*)로 분모를 산출한다.
  3. 본 쿼리의 SELECT절에서 바로 계산하여 최종 결과를 구한다.

[ 문제 상황 ]

  • 분모 분자 모두가 정수형이라 연산했을 때 소수점이 출력되지 않는다.(정수형으로만 결과 반환)

[ 해결 ]

  • 분모, 분자 중 하나의 값에 1.0을 곱하거나 CAST(정수, float)을 사용해서 강제로 데이터 타입을 변경한다.

[ 회고 ]

  • 정수끼리 연산하면 정수형으로 결과가 반환된다.
  • 이때 연산값 중 하나의 값만 실수로 바꿔줘도 실수(float)로 결과가 반환된다.