[241023_SQL] 집계함수 + 조건문, Date_add, NULL로 값 출력

JunichiK·2024년 10월 23일

SQL 스터디

목록 보기
19/21

코드 카타

문제 & 제출 답안

  • 1193. Monthly Transactions I
    SELECT date_format(trans_date, '%Y-%m') as month, 
        country,
        count(state) as trans_count,
        count(case when state = 'approved' then 1 end) as approved_count,
        sum(amount) as trans_total_amount,
        sum(if(state = 'approved', amount, 0)) as approved_total_amount
    FROM transactions
    GROUP BY 1,2
  • 1174. Immediate Food Delivery II
    SELECT round(count(case when immediate = 'immediate' then 1 end) / count(*) * 100,2) as immediate_percentage
    FROM
    (
    SELECT customer_id,
        order_date,
        if(order_date = customer_pref_delivery_date, 'immediate', 'scheduled') as immediate,
        first_value(order_date) over(partition by customer_id order by order_date) as first_order
    FROM delivery
    )
    A
    WHERE order_date = first_order
  • 550. Game Play Analysis IV
    # Write your MySQL query statement below
    WITH A as
    (
    SELECT player_id,
        event_date,
        first_value(event_date) over(partition by player_id) as first_login
    FROM activity
    )
    
    SELECT
        round(
        (
        SELECT count(distinct player_id)
        FROM A
        WHERE event_date = first_login + 1)/
        count(distinct player_id),2) as fraction
    FROM activity
    • 구할 것 : Round((첫 로그인 다음날 로그인한 유저수 / 전체 유저수) , 2)
    • 세부 구현
      1. 유저별 첫 로그인 날짜
        • First_value
      2. 그 다음날 로그인한 유저
        • WHERE event_date = first_value + 1
      3. 2번 유저 카운트
        • count(distinct player_id)
      4. 전체 유저 카운트
        • count(distinct player_id)
      5. 나누고 반올림
        • round((3번/4번),2)
  • 2356. Number of Unique Subjects Taught by Each Teacher
    SELECT teacher_id, count(distinct subject_id) as cnt
    FROM teacher
    GROUP BY 1
    • 구할 것 : 선생님별 교육 과목 수
    • 세부 구현
      1. 선생님별 그룹 바이
        • GROUP BY teacher_id
      2. 고유 과목 수 세기
        • COUNT(distinct subject_id)
  • 1141. User Activity for the Past 30 Days I
    SELECT activity_date AS day, Count(DISTINCT user_id) as active_users
    FROM Activity
    WHERE activity_date between DATE_ADD('2019-07-27', INTERVAL -29 DAY) and '2019-07-27'
    Group BY activity_date
    • 구해볼 것 : 2019-07-27 부터 30일 전까지 요일별 레코드가 찍힌 유저 수
    • 세부 구현
      1. 요일별 그룹바이
        • GROUP BY activity_date
      2. 2019-07-27 부터 30일 전까지
        • WHERE activity_date IN DATEDIFF(’2019-07-27’, 30)
      3. 유저 수 카운트
        • COUNT(user_id)
  • 1070. Product Sales Analysis III
    SELECT product_id, year as first_year, quantity, price
    FROM sales
    WHERE (product_id, year) in 
                (
                SELECT product_id, min(year)
                FROM sales
                GROUP BY 1
                )
    • 구해볼 것 : 제품별 첫 구매년도의 정보 (ID, 연도, 양, 가격) 구하기
    • 세부 구현
      1. 첫 구매년도 구하기
        • WHERE year in (SELECT min(year) FROM sales group by product_id)
      2. 제품별 그룹바이
        • GROUP BY product_id
      3. 정보 출력
        • SELECT
  • 596. Classes More Than 5 Students
    SELECT class
    FROM courses
    GROUP BY 1
    HAVING COUNT(student) >= 5
    • 구해야 할 것 : 5명 이상의 학생을 보유한 수업
    • 세부 구현
      1. 수업 그룹바이
      2. 학생 수 5명 이상 조건
      3. 수업 출력
  • 1729. Find Followers Count
    SELECT user_id, COUNT(follower_id) followers_count
    FROM followers
    GROUP BY 1
    ORDER BY 1
  • 619. Biggest Single Number
    SELECT MAX(num) as num
    FROM
    (
    SELECT num
    FROM mynumbers
    GROUP BY num
    HAVING count(*) = 1
    ) A
    • 구해야 하는 것 : 하나만 보유 중인 숫자 중 가장 큰 숫자 (Null일 땐 NULL 로 표기)
    • 세부 구현
      1. 숫자로 그룹바이
      2. having으로 한 번만 나온 숫자 조건 부여
      3. max 로 가장 큰 num 출력
      4. 없을 경우 null 로 표기되어야 하므로 인라인 서브쿼리 활용
  • 1045. Customers Who Bought All Products
    SELECT customer_id
    FROM customer
    GROUP BY 1
    HAVING (count(distinct product_key) / (SELECT count(*) FROM product)) = 1
    • 구해야 할 것 : 모든 제품을 구매한 고객 ID
    • 세부 구현
      1. 손님별 그룹 바이
      2. (손님별 구매한 제품) / (전체 제품 수) = 1 인 손님ID 출력
profile
represent ojeong-dong

0개의 댓글