반응형
특정 행 (row)의 건수를 출력하는 그룹 함수
예제. 사원 테이블의 전체 건수가 어떻게 되는가?
SELECT COUNT(*)
FROM emp;
SELECT COUNT(empno)
FROM emp;
둘의 출력 결과는 같음.
다만 그룹함수(ex. COUNT)는 널값을 무시하므로, 일부 컬럼에 null이 있으면, 전체 데이터와 갯수가 다를 수 있음.
제일 확실하게 데이터의 갯수를 세려면, 컬럼명보다 *이 안전함.
(OCP시험 문제)
다음 중 널 값의 여부와 관계없이 결과가 잘 카운트 되는 SQL은 무엇인가?
①
SELECT COUNT(COMM) FROM EMP;
②
SELECT COUNT(MGR) FROM EMP;
③
SELECT COUNT(*) FROM EMP;
문제 190. 직업, 직업별 인원 수를 출력하시오.
SELECT job, COUNT(*)
FROM EMP
GROUP BY job;
문제191. 위의 결과를 다시 출력하는데 직업별 인원수가 높은 것부터 출력하시오.
SELECT job, COUNT(*)
FROM EMP
GROUP BY job
ORDER BY 2 DESC;
문제 192. 문제 191번을 다시 출력하는데 직업별 인원 수가 2명 이상인 것만 출력하시오.
SELECT job, COUNT(*)
FROM EMP
GROUP BY job
HAVING COUNT(*)>= 2
ORDER BY 2 DESC;
문제 193. 문제 192번을 다시 수행하는데 출력되는 결과에서 직업이 SALESMAN은 제외하시오.
SELECT job, COUNT(*)
FROM EMP
WHERE job != 'SALESMAN'
GROUP BY job
HAVING COUNT(*)>= 2
ORDER BY 2 DESC;
문제 194. (OCP시험 문제) 사원 테이블에 직업의 종류가 몇 개 있는지 출력하시오.
SELECT COUNT(DISTINCT(job))
FROM emp;
문제 196. 서울 강남구에 스타벅스 매장이 몇 개가 있는지 출력하시오.
SELECT COUNT(*)
FROM MARKET_2022
WHERE 시군구명 = '강남구' AND 상호명 LIKE '%스타벅스%';
문제 197. 상호명에 스타벅스가 포함되어져 있는 데이터에서 시군구명, 시군구명별 건수를 출력하는데, 건 수가 높은 것부터 정렬하여 출력하시오.
SELECT 시군구명, COUNT(*)
FROM MARKET_2022
WHERE 상호명 LIKE '%스타벅스%'
GROUP BY 시군구명
ORDER BY 2 DESC;
문제 198. 위에 출력되는 결과 중에서 맨 첫번째 행 하나만 출력하시오.
SELECT 시군구명, COUNT(*)
FROM MARKET_2022
WHERE 상호명 LIKE '%스타벅스%'
GROUP BY 시군구명
ORDER BY 2 DESC FETCH FIRST 1 ROW ONLY;
FETCH FIRST n ROW ONLY;
n부분의 숫자를 지정해, 처음부터 n번째 행까지 출력하게 할 수 있다.
문제 199. 상호명에 스타벅스를 포함하고 있는 상권업종소분류명이 무엇인지 조회하시오.
SELECT *
FROM MARKET_2022
WHERE 상호명 LIKE '%스타벅스%';
문제 200. MARKET_2022 테이블에서 상권업종중분류명이 '커피점/카페'인 상호명, 상호명 별 건수를 출력하는데 상호명 별 건수가 높은 것부터 출력하시오.
SELECT 상호명, COUNT(*)
FROM MARKET_2022
WHERE 상권업종중분류명 LIKE '커피점/카페'
GROUP BY 상호명
ORDER BY 2 DESC;
문제 201. 위의 결과를 다시 출력하는데 상호명이 '카페'는 제외하고 출력하시오.
SELECT 상호명, COUNT(*)
FROM MARKET_2022
WHERE 상권업종중분류명 LIKE '커피점/카페' AND 상호명 != '카페'
GROUP BY 상호명
ORDER BY 2 DESC;
문제 202. 위의 SQL을 수정하는데 다음과 같이 수정하시오.
(스타벅스 @@점, 스타벅스 ##점 모두 스타벅스로 count되게)
SELECT CASE
WHEN 상호명 LIKE '%스타벅스%' THEN '스타벅스'
ELSE 상호명 END AS 상호명, COUNT(*)
FROM MARKET_2022
WHERE 상권업종중분류명 LIKE '커피점/카페' AND 상호명 != '카페'
GROUP BY CASE
WHEN 상호명 LIKE '%스타벅스%' THEN '스타벅스'
ELSE 상호명 END
ORDER BY 2 DESC;
문제 203. 위의 SQL에 스벅, 이디야,메가, 투썸도 추가하시오.
SELECT CASE
WHEN 상호명 LIKE '%스타벅스%' THEN '스타벅스'
WHEN 상호명 LIKE '%이디야커피%' THEN '이디야커피'
WHEN 상호명 LIKE '%메가엠지씨커피%' THEN '메가엠지씨커피'
WHEN 상호명 LIKE '%투썸플레이스%' THEN '투썸플레이스'
ELSE 상호명 END AS 상호명, COUNT(*)
FROM MARKET_2022
WHERE 상권업종중분류명 LIKE '커피점/카페' AND 상호명 != '카페'
GROUP BY CASE
WHEN 상호명 LIKE '%스타벅스%' THEN '스타벅스'
WHEN 상호명 LIKE '%이디야커피%' THEN '이디야커피'
WHEN 상호명 LIKE '%메가엠지씨커피%' THEN '메가엠지씨커피'
WHEN 상호명 LIKE '%투썸플레이스%' THEN '투썸플레이스'
ELSE 상호명 END
ORDER BY 2 DESC;
상호명이 모두 풀네임 + @@점 으로 구성되어 있지는 않음.
ex) '이디야커피 강남역점' 도 있지만 '이디야 강남역점'도 있음.
따라서 완벽한 코드는 아님. 연습용.
문제 204. 위의 SQL을 그대로 MARKET_2017에서 검색하시오.
(일부 순위 변경이 있어, 임의로 몇 브랜드 더 추가함)
SELECT CASE
WHEN 상호명 LIKE '%스타벅스%' THEN '스타벅스'
WHEN 상호명 LIKE '%이디야커피%' THEN '이디야커피'
WHEN 상호명 LIKE '%메가엠지씨커피%' THEN '메가엠지씨커피'
WHEN 상호명 LIKE '%투썸플레이스%' THEN '투썸플레이스'
WHEN 상호명 LIKE '%커피빈%' THEN '커피빈'
WHEN 상호명 LIKE '%공차%' THEN '공차'
ELSE 상호명 END AS 상호명, COUNT(*)
FROM MARKET_2017
WHERE 상권업종중분류명 LIKE '커피점/카페' AND 상호명 != '카페'
GROUP BY CASE
WHEN 상호명 LIKE '%스타벅스%' THEN '스타벅스'
WHEN 상호명 LIKE '%이디야커피%' THEN '이디야커피'
WHEN 상호명 LIKE '%메가엠지씨커피%' THEN '메가엠지씨커피'
WHEN 상호명 LIKE '%투썸플레이스%' THEN '투썸플레이스'
WHEN 상호명 LIKE '%커피빈%' THEN '커피빈'
WHEN 상호명 LIKE '%공차%' THEN '공차'
ELSE 상호명 END
ORDER BY 2 DESC;
'Oracle DBA > SQL' 카테고리의 다른 글
20230627 (5) SQL 042 : 데이터 분석 함수로 순위 출력하기 2(DENSE_RANK) (0) | 2023.06.27 |
---|---|
20230627 (4) SQL 041 : 데이터 분석 함수로 순위 출력하기 1(RANK) (0) | 2023.06.27 |
20230627 (2) SQL 039 : 토탈값 출력하기(SUM) (0) | 2023.06.27 |
20230627 (1) SQL 038 : 평균값 출력하기 (AVG) (0) | 2023.06.27 |
20230626 (5) SQL 037 : 최솟값 출력하기 (MIN) (0) | 2023.06.26 |