진료과별 총 예약 횟수 출력하기 - level 2
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/132202
- GROUP BY, WHERE 절을 이용한다.
Sol)
식품 분류별 가장 비싼 식품의 정보 조회하기 - level 4
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/131116
cf) 정답
# 식용 마저유: 8950
# 김치 배추김치: 19000
# 국 김치찌개: 2900
# 과자 허니버터칩: 1950
Sol 1) CTE 방식 - FROM 서브 쿼리와 같음
- A: 카테고리별 최대 금액, 상품 ID 정보를 담고 있다.
- B: 전체 테이블이며 여기에서 상품 이름을 조회해야한다.
- A의 최대 금액(M)과 B의 상품 금액이 같은 것만 조회해야한다.
Sol 2) WHERE 절 서브 쿼리
Sol 3) WHERE 절 서브 쿼리
- 아래와 같이 PRICE IN() 으로 비교를 하고 내부 쿼리에 CATEGORY를 비교하지 않더라도 통과
카테고리를 비교하지 않았는데 어떻게 맞는지 모르겠다- 프로그래머스는 테스트 케이스가 하나인데 row 들이 중복되지 않아서 문제 없도록 구성되어 있다.
- 정확하게 따지면 price 를 등호로 비교하고 where 절로 비교하는 것이 정확하다.
- IN() 안에는 카테고리별 최대 금액이 모두 들어가 있다.
- Ex) 카테고리 비교하지 않을 때 문제점
- 만약 식용유, 김치 가격이 이렇게 구성된다면?
- 식용유: 4500 5000
- 김치: 4000 4500
- 이라고 하면 4500원 짜리 식용유는 김치 MAX 와 같다.
- 이런 식으로 금액이 다른 카테고리의 MAX 값과 겹치는 경우는 아래 쿼리가 오답이 될 수 있다.
- 프로그래머스의 테스트 케이스 테이블을 보면 네 개의 max 집합 = { 1950, 2900, 19000, 8950} 인데
- a) 김치 중 max 아닌 값: { 16950, 17000, 17500}
- b) 식용유 중 max 아닌 값 : {4880, 5950, 7200}
- c ) 국 중 max 아닌 값 : { 2400, 2450, 2700}
- d) 과자 중 max 아닌 값 : {1500, 1800, 1900}
- a, b, c, d 중에서 max 집합에 속하는 값이 없기 떄문에 테스트를 통과한거 아닌가?
- 다시 말해서, {a, b, c, d } 중에서 max 집합과 교집합이 있는 테스트 케이스가 나오면 오답일 수도 있을 것 같다.
- 왜냐하면 카테고리를 비교하지 않기 때문
- 만약 식용유, 김치 가격이 이렇게 구성된다면?
즐겨찾기가 가장 많은 식당 정보 출력하기 - level 3
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/131123
Sol )
- 가장 먼저 MAP 처럼 {음식타입, 즐겨찾기 최댓값} 만으로 테이블을 만든다.
- 그리고 원래의 테이블과 비교하면서 즐겨찾기 값이 같은 경우만 골라서 출력하도록 WHERE 절 조건을 넣어준다.
대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 - level 3
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/151139
- GROUP BY CAR_ID, MONTH .. 이런 식으로 만들어 줘야한다.
Sol)
- 대여 기간은 시작일(START_DATE)을 기준으로 한다.
- SUB_H: 전체 테이블과 JOIN 하기 위해 만드는 테이블이며 자동차별로 해당 기간에 대여한 횟수를 COUNT 해서 반환한다.
- 따라서 이 테이블은 대여 횟수 5 이상인 자동차 ID 정보만을 가져오기 위해서 필요한 테이블이다.
- H: 전체 테이블
- SUB_H 테이블에서 대여 횟수가 5이상인 데이터만 가져온 다음에, H 테이블에서도 기간 조건을 만족하는 데이터를 가져와서 JOIN 한다. 두 개의 테이블에 기간 조건을 공통적으로 넣어줘야한다.
- 아래 블로그 내용을 참고해서 조금 변형해서 풀었다.
출처 - https://amyyzzin.tistory.com/411
카테고리별 도서 판매량 집계하기
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/144855
Sol)
- JOIN해서 각 카테고리에 대한 모든 판매량을 더해준다.
성분으로 구분한 아이스트림 총 주문량
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/133026
Sol)
- group by 로 나눠서 주문량의 총합을 구한다.
자동차 종류별 특정 옵션이 포함된 자동차 수 구하기 - level 2
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/151137
Sol)
- GROUP BY
- LIKE() 안에 와일드 카드를 넣어서 조건을 만든다.
고양이와 개는 몇 마리 있을까 - level 2
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/59040
Sol)
동명 동물 수 찾기 - level 2
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/59041
Sol)
- where절에 is not null을 꼭 추가해야한다.
입양 시각 구하기 (1) - level 2
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/59412
Sol)
- 동일한 두 개의 테이블을 조인해서 가져온다.
- PK인 ANIMAL_ID를 사용해서 조인한다.
- COUNT(ANIMAL_ID)를 해주면 해당하는 시간에 맞는 로우를 카운트한다.
- 시간 형식은 DATE_FORMAT()을 사용한다.
가격대 별 상품 개수 구하기 - level 2
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/131530
Sol)
- 가격을 의미하는 PRICE에서 10000으로 나눈 나머지를 빼면 PRICE_GROUP를 구할 수 있다.
조건에 맞는 사용자와 총 거래금액 조회하기- level 3
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/164668
Sol)
- 임시 쿼리 안에 총 거래 금액을 구하고 WHERE 절 조건으로 DONE 상태인 로우만 가져오도록 쿼리를 짠다.
자동차 대여 기록에서 대여 중 / 대여 가능 여부 구분하기 - level 3
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/157340
Sol)
- tmp: 대여중인 car에 대해서만 1을 넣어주고 다른 행은 모두 0으로 넣어준다.
- 본 쿼리에서는 GROUP BY를 이용해서 위에 숫자로 표현한 값을 모두 더해주고 더한 값이 1인 경우는 "대여중", 그 외의 경우는 "대여 가능"으로 표시한다.
저자 별 카테고리 별 매출액 집계하기 - level 4
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/144856
Sol)
- GROUP BY 조건을 이중으로 넣는다.
- WHERE 절에도 연도, 월에 대한 조건을 반드시 넣어야한다.
년, 월, 성별 별 상품 구매 회원 수 구하기- level 4
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/131532
Sol)
- DISTINCT를 꼭 넣어줘야한다. 넣지 않으면 같은 USER_ID가 중복되서 카운트되기 때문에 주의한다.
- GROUP BY로 세 번 중첩해서 그룹을 나눠준다.
입양 시각 구하기 (2) - level 4
출처 - https://school.programmers.co.kr/learn/courses/30/lessons/59413
Sol)
- 행 번호를 생성해야한다.
- set @hour = - 1; 변수를 생성한다.
- SELECT @hour := @hour + 1 FROM ANIMAL_OUTS WHERE @hour < 23
- 서브쿼리를 이용해서 외부 쿼리와 시간이 같은 경우에 대해서 COUNT() 해준다.
'컴퓨터 과학 > [프로그래머스 & Leet Code] MySQL 문제 풀이' 카테고리의 다른 글
[programmers] String, Date (0) | 2023.05.27 |
---|---|
[programmers] SUM, MAX, MIN (0) | 2023.05.25 |
[programmers] IS NULL (0) | 2023.05.22 |
[leetcode] Day 2. SELECT & Order (0) | 2022.11.24 |
[leetcode] SELECT (0) | 2022.09.28 |