Problem Solving

[Oracle] SQL 그룹 문제 풀이 (문제집 06)

Isaac S. Lee 2023. 9. 3. 23:13

🚩종별 그룹

--2. tblZoo. 종류(family)별 평균 다리의 갯수를 가져오시오.

나의 풀이

SELECT
	family AS 종류,
	round(avg(leg)) AS 평균다리개수
FROM TBLZOO
	GROUP BY family;

 

🚩종의 체온과 호흡별 그룹

--3. tblZoo. 체온이 변온인 종류 중 아가미 호흡과 폐 호흡을 하는 종들의 갯수를 가져오시오.

나의 풀이

SELECT * FROM TBLZOO;

SELECT
	breath AS 호흡,
	count(*) AS 개수
FROM TBLZOO
	WHERE THERMO = 'variable'
		GROUP BY BREATH;

 

정답

SELECT * FROM tblzoo;
SELECT 
    count(case
        when breath in ('lung') then 1
    end) as "변온,폐 호흡",
    count(case
        when breath in ('gill') then 1
    end) as "변온,아가미 호흡"
FROM tblzoo
    GROUP BY thermo
        HAVING thermo = 'variable';

 

🚩사이즈와 종류별 그룹

--4. tblZoo. 사이즈와 종류별로 그룹을 나누고 각 그룹의 갯수를 가져오시오.

나의 풀이

SELECT
	sizeof,
    family,
    COUNT(*)
FROM TBLZOO
	GROUP BY sizeof, family;

 

정답

SELECT * FROM tblZoo;
SELECT family||decode(sizeof,'small','소형','medium','중형','large','대형') as 분류, count(family) FROM tblzoo
    GROUP BY family,sizeof 
        ORDER BY family asc, sizeof desc;

 

🚩중복된 이메일

--12. tblAddressBook. 관리자의 실수로 몇몇 사람들의 이메일 주소가 중복되었다. 중복된 이메일 주소만 가져오시오.

나의 풀이

SELECT
	email, 
	count(email) AS 중복횟수
FROM tblAddressBook
	GROUP BY email
		HAVING count(email) > 1;

 

정답

SELECT 
    email, count(email)
FROM tbladdressbook 
    group by email having count(email) > 1;

 

🚩인원수 100명 이상인 성씨

--15. tblAddressBook. 성씨별 인원수가 100명 이상 되는 성씨들을 가져오시오.

나의 풀이

SELECT
	substr(name, 1, 1) AS 성씨,
	count(*) AS 인원수
FROM tblAddressBook
	GROUP BY substr(name, 1, 1)
		HAVING count(*) >= 100;

 

정답

SELECT substr(name,1,1) FROM tbladdressbook group by substr(name,1,1) having count(substr(name,1,1)) >= 100;

 

🚩스네이크 명명법

--17. tblAddressBook. 이메일이 스네이크 명명법으로 만들어진 사람들 중에서 여자이며, 20대이며, 키가 150~160cm 사이며, 고향이 서울 또는 인천인 사람들만 가져오시오.

나의 풀이

SELECT
	*
FROM tblAddressBook
WHERE
	email LIKE '%\_%' ESCAPE '\'
	AND gender = 'f' -- 여자
	AND age BETWEEN 20 AND 29 -- 20대
	AND height BETWEEN 150 AND 160 -- 150~160cm
	AND hometown IN ('서울', '인천') -- 서울 또는 인천

 

정답

SELECT * FROM tbladdressbook;
SELECT * FROM tbladdressbook
    where instr(email,'_') <> 0 and gender = 'f' and age like ('2_') and height <= 160 and height >= 150 and hometown in ('서울','인천');

 

🚩특정 직업의 거주 지역 비율

--20. tblAddressBook. '건물주'와 '건물주자제분'들의 거주지가 서울과 지방의 비율이 어떻게 되느냐?

나의 풀이

SELECT
	round(sum(CASE WHEN address LIKE '%서울%' THEN 1 ELSE 0 END) / count(*) * 100) || '%' AS 서울거주비율,
	round(sum(CASE WHEN address NOT LIKE '%서울%' THEN 1 ELSE 0 END) / count(*) * 100) || '%' AS 지방거주비율
FROM tblAddressBook
	WHERE job IN ('건물주', '건물주자제분');
--concat
SELECT
    concat(round(sum(CASE WHEN address LIKE '%서울%' THEN 1 ELSE 0 END) / COUNT(*) * 100), '%') AS 서울거주비율,
    concat(round(sum(CASE WHEN address NOT LIKE '%서울%' THEN 1 ELSE 0 END) / COUNT(*) * 100), '%') AS 지방거주비율
FROM tblAddressBook
	WHERE job IN ('건물주', '건물주자제분');

 

정답

SELECT job,
    round(count(case
        when substr(address,1,2) like ('%서울%') then 1 
    end)/count(job)*100,2)||'%' as "서울 거주자",
     round(count(case
        when substr(address,1,2) not like ('%서울%') then 1 
    end)/count(job)*100,2)||'%' as "(비)서울 거주자"   
FROM tbladdressbook group by job having job in ('건물주','건물주자제분');