Closed yeongleej closed 1 month ago
2018.06.28~2019.07.27까지 30일동안 학생 활동 수 구하는 문제
SELECT activity_date AS day, COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE activity_date BETWEEN '2019-06-28' AND '2019-07-27'
GROUP BY activity_date
ORDER BY activity_date;
Group By 사용한 이유 : 활동날짜를 계산하기 위해 행을 그룹화
SQL 쿼리 순서 지키기 SELECT → FROM → WHERE → GROUP BY → ORDER BY
SELECT CLASS
FROM COURSES
GROUP BY CLASS
HAVING COUNT(CLASS) >= 5;
SELECT USER_ID, COUNT(FOLLOWER_ID) AS FOLLOWERS_COUNT
FROM FOLLOWERS
GROUP BY USER_ID
ORDER BY USER_ID;
문제가 너무 쉬운거 같아서 양심상 2개 풀었습니당 ^^ㅎㅎ
SELECT
customer_id
FROM
Customer
GROUP BY
customer_id
HAVING
COUNT(DISTINCT product_key) = (
SELECT
COUNT(product_key)
FROM
Product
)
DISTINCT
를 이용해서 중복을 제거해서 COUNT
SELECT
fp.CATEGORY, fp.PRICE, fp.PRODUCT_NAME
FROM FOOD_PRODUCT fp
JOIN
(SELECT CATEGORY, MAX(PRICE) MAX_PRICE
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자','국','김치','식용유')
GROUP BY CATEGORY) AS sub
ON fp.CATEGORY = sub.CATEGORY AND fp.PRICE = sub.MAX_PRICE
ORDER BY fp.PRICE DESC;
각 카테고리 별로 최고 가격 조회
하여 JOIN 조건 CATEGORY
와 MAX_PRICE
로 결합IN
조건으로 조회하기
SELECT
CATEGORY, PRICE, PRODUCT_NAME
FROM FOOD_PRODUCT
WHERE (CATEGORY, PRICE) IN (
SELECT
CATEGORY, MAX(PRICE)
FROM FOOD_PRODUCT
WHERE CATEGORY IN ('과자', '국', '김치', '식용유')
GROUP BY CATEGORY
)
ORDER BY PRICE DESC;
SELECT user_id, COUNT(follower_id) AS followers_count
FROM Followers
GROUP BY user_id
ORDER BY user_id;
SELECT
event_day AS day,
emp_id,
SUM(out_time-in_time) AS total_time
FROM Employees
GROUP BY emp_id, day;
쉬운 문제...ㅎ하나만 풀려했는데 지영님 2개 푸셨길래 저도 2개 풀어봤습니다ㅋㅎㅋㅎ
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO
WHERE (FOOD_TYPE, FAVORITES) IN(
SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC
서브쿼리: 음식 종류별로 가장 많은 즐겨찾기 찾기
메인: 서브쿼리에서 반환된 (FOOD_TYPE, FAVORITES)과 같은 음식 찾기
[시행착오]: 서브쿼리의 반환값을 (REST_ID, MAX(FAVORITES))로 반환했는데, 이렇게하면 MAX(FAVORITES)에 해당하는 REST_ID를 갖고오지 못함
결론: 어떤 그룹으로 묶는지 잘 생각하자
USER_INFO
테이블과 ONLINE_SALE
테이블에서 년, 월, 성별 별로 상품을 구매한 회원수를 집계하는 SQL문을 작성SELECT
YEAR(A.SALES_DATE) YEAR
, MONTH(A.SALES_DATE) MONTH
, B.GENDER
, COUNT(DISTINCT(A.USER_ID)) USERS
FROM
ONLINE_SALE A
INNER JOIN USER_INFO B
ON A.USER_ID = B.USER_ID
WHERE
B.GENDER IS NOT NULL
GROUP BY
YEAR
, MONTH
, GENDER
ORDER BY
YEAR
, MONTH
, GENDER
DISTINCT
를 이용해서 중복을 제거해서 COUNT
SELECT activity_date AS day,
COUNT(DISTINCT user_id) AS active_users
FROM Activity
WHERE activity_date BETWEEN '2019-06-28' AND '2019-07-27'
GROUP BY activity_date;
상반기 동안 각 아이스크림 성분 타입과 성분 타입에 대한 아이스크림의 총주문량을 총주문량이 작은 순서대로 조회
SELECT B.INGREDIENT_TYPE, SUM(TOTAL_ORDER) AS TOTAL_ORDER
FROM FIRST_HALF A
JOIN ICECREAM_INFO B ON A.FLAVOR = B.FLAVOR
GROUP BY INGREDIENT_TYPE
ORDER BY TOTAL_ORDER ASC
행을 그룹화
하여 총 주문량 계산
2022년 5월에 예약한 환자 수를 진료과코드 별로 조회하는 SQL문을 작성
SELECT MCDP_CD AS '진료과코드', COUNT(PT_NO) AS '5월예약건수'
FROM APPOINTMENT
WHERE YEAR(APNT_YMD) = '2022' AND MONTH(APNT_YMD) = '05'
GROUP BY MCDP_CD
ORDER BY 5월예약건수, 진료과코드
행을 그룹화
하여 2022년 5월에 예약한 환자수 계산
3주차 복습한 문제
년, 월, 성별 별로 상품을 구매한 회원수를 집계
SELECT
YEAR(os.SALES_DATE) YEAR,
MONTH(os.SALES_DATE) MONTH,
ui.GENDER,
COUNT(DISTINCT ui.USER_ID) USERS
FROM USER_INFO ui
INNER JOIN ONLINE_SALE os
ON ui.USER_ID = os.USER_ID
WHERE ui.GENDER IS NOT NULL
GROUP BY MONTH, ui.GENDER
ORDER BY YEAR, MONTH, ui.GENDER;
DATE 타입에 YEAR()
MONTH()
와 같은 날짜 함수를 사용하면 쉽게 특정 날짜/시간만 가져올 수 있음
유용한 날짜 관련 함수가 많아서 참고하면 좋을 것 같아요! 날짜 관련 함수 참고 블로그
FISH_INFO
테이블에 날짜 별로 물고기를 잡은 정보가 있을 때, 월 별로 물고기를 몇 마리 잡았는지 나타내는 테이블 출력하기
SELECT COUNT(*) `FISH_COUNT`, MONTH(TIME) `MONTH`
FROM FISH_INFO
GROUP BY MONTH
ORDER BY MONTH ASC
MONTH(TIME) MONTH
를 하고 GROUP BY MONTH
하기FISH_INFO
테이블과 FISH_NAME_INFO
테이블이 있을 때, 물고기 종류 별로 잡은 개수 구하기SELECT COUNT(*) AS `FISH_COUNT`, B.FISH_NAME `FISH_NAME`
FROM FISH_INFO A
LEFT JOIN FISH_NAME_INFO B ON A.FISH_TYPE = B.FISH_TYPE
GROUP BY FISH_NAME
ORDER BY FISH_COUNT DESC
FISH_COUNT
와 FISH_NAME_INFO
테이블 조인하기COUNT
를 통해 개수 세기ORDER BY
를 통해 정렬하기
GROUP BY