Oracle DBA/SQL

20230627 (3) SQL 040 건수 출력하기(COUNT)

Nuez 2023. 6. 27. 15:04
반응형

특정 행 (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;