컴퓨터 과학/[프로그래머스 & Leet Code] MySQL 문제 풀이

[programmers] GROUP BY

계란💕 2022. 11. 25. 01:41

진료과별 총 예약 횟수 출력하기 - level 2

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/132202

  • GROUP BY, WHERE 절을 이용한다.

  Sol) 

sql
열기

 


식품 분류별 가장 비싼 식품의 정보 조회하기 - 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의 상품 금액이 같은 것만 조회해야한다. 
sql
열기

 

 

  Sol 2) WHERE 절 서브 쿼리

  •  
sql
열기

 

 

  Sol 3) WHERE 절 서브 쿼리

sql
열기

 

  • 아래와 같이 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 절 조건을 넣어준다. 
sql
열기

 


대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기 - 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

sql
열기

 


카테고리별 도서 판매량 집계하기

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/144855

 

 

 Sol) 

  • JOIN해서 각 카테고리에 대한 모든 판매량을 더해준다. 
sql
열기

 


성분으로 구분한 아이스트림 총 주문량

출처  - https://school.programmers.co.kr/learn/courses/30/lessons/133026 

 

  Sol)

sql
열기
  • group by 로 나눠서 주문량의 총합을 구한다. 

 


자동차 종류별 특정 옵션이 포함된 자동차 수 구하기 - level 2

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/151137 

 

  Sol)

sql
열기
  • GROUP BY
  • LIKE() 안에 와일드 카드를 넣어서 조건을 만든다. 

고양이와 개는 몇 마리 있을까 - level 2

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/59040 

 

  Sol)

sql
열기

 


동명 동물 수 찾기 - level 2

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/59041 

 

  Sol)

sql
열기
  • where절에 is not null을 꼭 추가해야한다. 

 


입양 시각 구하기 (1) - level 2

출처  - https://school.programmers.co.kr/learn/courses/30/lessons/59412

 

  Sol)

sql
열기
  • 동일한 두 개의 테이블을 조인해서 가져온다. 
  • PK인 ANIMAL_ID를 사용해서 조인한다. 
  • COUNT(ANIMAL_ID)를 해주면 해당하는 시간에 맞는 로우를 카운트한다. 
  • 시간 형식은 DATE_FORMAT()을 사용한다. 

 


가격대 별  상품 개수 구하기 - level 2

출처  - https://school.programmers.co.kr/learn/courses/30/lessons/131530

  Sol)

sql
열기
  • 가격을 의미하는 PRICE에서 10000으로 나눈 나머지를 빼면  PRICE_GROUP를 구할 수 있다. 

 


조건에 맞는 사용자와 총 거래금액 조회하기- level 3

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/164668

  Sol)

sql
열기
  • 임시 쿼리 안에 총 거래 금액을 구하고  WHERE 절 조건으로 DONE 상태인 로우만 가져오도록 쿼리를 짠다. 

 


자동차 대여 기록에서 대여 중 / 대여 가능 여부 구분하기 - level 3

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/157340  

  Sol)

sql
열기
  • tmp: 대여중인 car에 대해서만 1을 넣어주고 다른 행은 모두 0으로 넣어준다. 
  • 본 쿼리에서는 GROUP BY를 이용해서 위에 숫자로 표현한 값을 모두 더해주고 더한 값이 1인 경우는 "대여중", 그 외의 경우는 "대여 가능"으로 표시한다. 

저자 별 카테고리 별 매출액 집계하기  - level 4

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/144856

  Sol)

sql
열기
  • GROUP BY 조건을 이중으로 넣는다. 
  • WHERE 절에도 연도, 월에 대한 조건을 반드시 넣어야한다. 

년, 월, 성별 별 상품 구매 회원 수 구하기-  level 4

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/131532  

  Sol)

  • DISTINCT를 꼭 넣어줘야한다. 넣지 않으면 같은 USER_ID가 중복되서 카운트되기 때문에 주의한다. 
  • GROUP BY로 세 번 중첩해서 그룹을 나눠준다. 
sql
열기

 


입양 시각 구하기 (2) -  level 4

출처 - https://school.programmers.co.kr/learn/courses/30/lessons/59413  

  Sol)

sql
열기
  • 행 번호를 생성해야한다. 
  • 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