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
- 분모와 분자 테이블을 각각 만든다.
- 만든 테이블을 FULL OUTER JOIN을 통해 MERGE한다.
- MERGE한 테이블에서 각 열을 SUM하여 최종 분모 분자를 구한다.
- 3번에서 산출된 분모 분자를 나눠서 최종 결과를 구한다.
풀이 2
- SELECT 절에 서브쿼리로 분자를 산출한다.
- 본 쿼리에서 COUNT(*)로 분모를 산출한다.
- 본 쿼리의 SELECT절에서 바로 계산하여 최종 결과를 구한다.
[ 문제 상황 ]
- 분모 분자 모두가 정수형이라 연산했을 때 소수점이 출력되지 않는다.(정수형으로만 결과 반환)
[ 해결 ]
- 분모, 분자 중 하나의 값에 1.0을 곱하거나 CAST(정수, float)을 사용해서 강제로 데이터 타입을 변경한다.
[ 회고 ]
- 정수끼리 연산하면 정수형으로 결과가 반환된다.
- 이때 연산값 중 하나의 값만 실수로 바꿔줘도 실수(float)로 결과가 반환된다.
'DA Study > TIL' 카테고리의 다른 글
[TIL] 다중 논리 연산자, 게임 평점 예측하기 1 #SQL #SQLite #solvesql (2) | 2024.12.22 |
---|---|
[TIL] 3개 이상의 LEFT JOIN, 날짜 형식 포맷팅 #SQL #SQLite #solvesql (0) | 2024.12.21 |
[TIL] 언더스코어(_)가 포함되지 않은 데이터 찾기 #SQL #ORACLE (1) | 2024.12.19 |
[TIL] 입양 시각 구하기(2) # MYSQL (0) | 2024.12.17 |
[TIL] 그룹별 조건에 맞는 식당 목록 출력하기 # MYSQL (1) | 2024.12.17 |