MAX함수를 이용해 최댓값을 구해보자. 여기서 AS는 별칭을 의미한다.
SELECT MAX(PRICE) AS MAX_PRICE
FROM PRODUCT
고양이를 개보다 먼저 조회해야 하므로 ORDER BY도 사용해야한다.
SELECT ANIMAL_TYPE, COUNT(ANIMAL_TYPE)
FROM ANIMAL_INS
GROUP BY ANIMAL_TYPE
ORDER BY ANIMAL_TYPE;
GROUP BY와 함께 사용되는 HAVING 절을 사용하도록 한다.
SELECT NAME, COUNT(NAME) AS 'COUNT'
FROM ANIMAL_INS
GROUP BY NAME
HAVING COUNT(NAME)>=2
ORDER BY NAME;
여기서 COUNT함수에 대해
따라서, COUNT(*)을 작성했다면
WHERE NAME IS NOT NULL 을 함께 작성해야합니다.
(문제와는 관계없음)
WHERE 컬럼명 LIKE "%단어%"
를 사용하면 특정 컬럼에서 특정 단어가 들어간 행을 추출할 수 있고, 모두 XX시트 형태 이므로 '%시트%'를 사용하면 OPTIONS 컬럼 값에 '시트'가 하나 이상 포함된 행을 추출합니다.
SELECT CAR_TYPE, COUNT(OPTIONS) AS CARS
FROM CAR_RENTAL_COMPANY_CAR
WHERE OPTIONS LIKE "%시트%"
GROUP BY CAR_TYPE
ORDER BY CAR_TYPE;
ORDER BY에도 COUNT
를 써서 정렬이 가능하다.
또한 AS
로 사용한 별칭을 ORDER BY에 써도 무방
ORDER BY 5월예약건수, 진료과코드
;
SELECT MCDP_CD AS '진료과코드', COUNT(MCDP_CD) AS '5월예약건수'
FROM APPOINTMENT
WHERE YEAR(APNT_YMD)='2022' AND MONTH(APNT_YMD)='05'
GROUP BY MCDP_CD
ORDER BY COUNT(MCDP_CD), MCDP_CD;
GROUP BY
와 COUNT
를 사용해 상품 카테고리 코드별 상품개수 구해주기SELECT LEFT(PRODUCT_CODE,2) AS CATEGORY,
COUNT(PRODUCT_ID) AS PRODUCTS
FROM PRODUCT
GROUP BY CATEGORY
ORDER BY CATEGORY;
HAVING
을 이용해 시간대별로 GROUP 마다 COUNT를 해준다
이때, HAVING 절에 HOUR(DATETIME)을 하지 않도록 주의(에러)
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR>=9 AND HOUR<=19
ORDER BY HOUR;
HAVING 절을 사용하지 않고 WHERE
을 사용해도 코드를 작성할 수 있다.
SELECT HOUR(DATETIME) AS HOUR, COUNT(DATETIME) AS COUNT
FROM ANIMAL_OUTS
WHERE HOUR(DATETIME)>=9 AND HOUR(DATETIME)<=19
GROUP BY HOUR(DATETIME)
ORDER BY HOUR;
CAR_ID로 그룹을 묶고 HAVING
으로 평균 대여 기간이 7일 이상인 컬럼을 출력
DATEDIFF(끝나는 날짜, 시작하는 날짜) 를 이용하는데, 차이에 1을 더해주는 것을 잊지말자🤣
SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE,START_DATE)+1),1) AS AVERAGE_DURATION
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
GROUP BY CAR_ID
HAVING AVG(DATEDIFF(END_DATE,START_DATE)+1) >= 7
ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC;
GROUP BY {컬럼1}, {컬럼2}
를 이용하면 두개의 컬럼에 대해서도 그룹화를 할 수 있습니다.
HAVING
절을 이용해 집계 결과에서 COUNT(*)가 2 이상인 데이터만을 조회
SELECT USER_ID, PRODUCT_ID
FROM ONLINE_SALE
GROUP BY USER_ID, PRODUCT_ID
HAVING COUNT(*) >=2
ORDER BY USER_ID, PRODUCT_ID DESC;
SELECT TRUNCATE(PRICE,-4) AS PRICE_GROUP, COUNT(PRICE) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
가격(PRICE)를 10000로 나누고, 만자리 이하를 버려야한다.
자릿수를 명시하지 않으면 오류가 나므로 주의
SELECT TRUNCATE(PRICE/10000,0)*10000 AS PRICE_GROUP, COUNT(PRICE) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
SELECT FLOOR(PRICE/10000)*10000 AS PRICE_GROUP, COUNT(PRICE) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
코드가 길어지지만 CASE WHEN
을 사용해 그룹화하여 출력해도 된다.
CASE WHEN 0<=PRICE AND PRICE<=10000 THEN 0 을 써도 무방
SELECT
CASE WHEN PRICE BETWEEN 0 AND 9999 THEN 0
WHEN PRICE BETWEEN 10000 AND 19999 THEN 10000
WHEN PRICE BETWEEN 20000 AND 29999 THEN 20000
WHEN PRICE BETWEEN 30000 AND 39999 THEN 30000
WHEN PRICE BETWEEN 40000 AND 49999 THEN 40000
WHEN PRICE BETWEEN 50000 AND 59999 THEN 50000
WHEN PRICE BETWEEN 60000 AND 69999 THEN 60000
WHEN PRICE BETWEEN 70000 AND 79999 THEN 70000
WHEN PRICE BETWEEN 80000 AND 89999 THEN 80000
ELSE 90000 END AS PRICE_GROUP,
COUNT(*) AS PRODUCTS
FROM PRODUCT
GROUP BY PRICE_GROUP
ORDER BY PRICE_GROUP;
합계를 출력하라고 했으므로 SUM
을 이용하고, GROUP BY
를 이용해 같은 아이디별로 그룹을 만들어야 한다.
SELECT A.PRODUCT_CODE, SUM(B.SALES_AMOUNT*A.PRICE) AS SALES
FROM PRODUCT AS A
JOIN OFFLINE_SALE AS B
ON A.PRODUCT_ID = B.PRODUCT_ID
GROUP BY A.PRODUCT_ID
ORDER BY SALES DESC, PRODUCT_CODE;
서브쿼리를 이용해 작성
=
을 쓰면 오류가 난다. 1개 이상의 행을 리턴하므로 IN
을 써서 해결하면 된다!GROUP BY
로 그룹들을 묶어준뒤, HAVING
으로 그룹에 대한 조건을 달아주면 된다. 이 때 WHERE문을 쓰지 않도록 주의해주자😥정답 코드
SELECT ID, NAME, HOST_ID
FROM PLACES
WHERE HOST_ID IN (SELECT HOST_ID
FROM PLACES
GROUP BY HOST_ID
HAVING COUNT(*)>=2)
ORDER BY ID;