GreatAlgorithm-Study / AlgorithmStudy

🌟알고리즘 대장정🌟
6 stars 4 forks source link

[8주차_SQL] SQL 풀이 모음 #109

Closed baexxbin closed 2 weeks ago

baexxbin commented 3 weeks ago
## 문제: [문제명](링크)

### 설명

### 코드

### 아이디어
baexxbin commented 3 weeks ago

문제: 1193. Monthly Transactions I

설명

코드

  SELECT 
      DATE_FORMAT(trans_date, '%Y-%m') AS month, 
      country,
      COUNT(*) AS trans_count,
      SUM(IF(state ='approved', 1, 0)) AS approved_count,
      SUM(amount) AS trans_total_amount,
      SUM(IF(state ='approved', amount, 0)) AS approved_total_amount
  FROM Transactions
  GROUP BY month, country

아이디어

yeongleej commented 3 weeks ago

문제: Game Play Analysis IV

설명

코드

SELECT ROUND(COUNT(DISTINCT A.player_id) / (SELECT COUNT(DISTINCT player_id) FROM activity), 2) AS fraction
FROM activity A
JOIN activity B
on A.player_id = B.player_id
WHERE (A.player_id, A.event_date) in (SELECT player_id, min(event_date) FROM activity group by player_id) AND DATEDIFF(B.event_date, A.event_date) = 1

아이디어

yeahdy commented 3 weeks ago

문제: 상품을 구매한 회원 비율 구하기

설명

  1. 회원 정보를 담은 USER_INFO 테이블
  2. 온라인 상품 판매 정보를 담은 ONLINE_SALE 테이블
    • 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수, 상품을 구매한 회원의 비율, 별로 출력
    • 비율 = 2021년에 가입한 회원 중 상품을 구매한 회원수 / 2021년에 가입한 전체 회원 수
    • 상품을 구매한 회원의 비율은 소수점 두번째 자리에서 반올림
    • 전체 결과는 년,월 기준으로 오름차순 정렬

코드

-- 2021년에 가입한 전체 회원들 중 상품을 구매한 회원수
WITH PURCHASED_DATA AS (
    SELECT
        YEAR(os.SALES_DATE) YEAR,
        MONTH(os.SALES_DATE) MONTH,
        COUNT(DISTINCT os.USER_ID) PURCHASED_USERS  
    FROM USER_INFO ui
    JOIN ONLINE_SALE os
    ON ui.USER_ID = os.USER_ID
    WHERE YEAR(ui.JOINED) = '2021' AND os.SALES_AMOUNT > 0
    GROUP BY YEAR, MONTH
),
-- 2021 년에 회원가입한 회원ID
TOTAL_USER AS (
    SELECT USER_ID
    FROM USER_INFO 
    WHERE YEAR(JOINED) = '2021'
    GROUP BY USER_ID
)
SELECT
    pd.YEAR,
    pd.MONTH,
    pd.PURCHASED_USERS,
    ROUND(pd.PURCHASED_USERS / (SELECT COUNT(USER_ID) FROM TOTAL_USER)
        ,1) PUCHASED_RATIO
FROM PURCHASED_DATA pd;

아이디어

icegosimperson commented 3 weeks ago

문제: 조회수가 가장 많은 중고거래 게시판의 첨부파일 조회하기

설명

코드

SELECT CONCAT('/home/grep/src/', A.BOARD_ID,'/',B.FILE_ID,B.FILE_NAME,B.FILE_EXT) AS FILE_PATH
FROM USED_GOODS_BOARD A JOIN USED_GOODS_FILE B
    ON A.BOARD_ID = B.BOARD_ID
WHERE A.VIEWS IN (SELECT MAX(VIEWS) FROM USED_GOODS_BOARD)
ORDER BY FILE_ID DESC;

아이디어

String, Date 카테고리에 있어서 풀어봤는데, 풀어보니까 String 주제에 더 가까운 문제 였네요 ,,!

Jewan1120 commented 3 weeks ago

문제: 610. Triangle Judgement

설명

코드

SELECT 
    x
    , y
    , z
    , CASE 
        WHEN x + y > z AND x + z > y AND y + z > x THEN 'Yes'
        ELSE 'No'
    END AS `triangle`
FROM 
    Triangle

아이디어

icegosimperson commented 3 weeks ago

문제: 입양 시각 구하기(1)

설명

09:00부터 19:59까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성

코드

SELECT HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM ANIMAL_OUTS
GROUP BY HOUR(DATETIME)
HAVING HOUR >= 9 AND HOUR <= 19
ORDER BY HOUR

아이디어

baexxbin commented 3 weeks ago

문제: 626. Exchange Seats

설명

코드

SELECT
    CASE
        WHEN MOD(id, 2) = 1 AND id = (SELECT MAX(id) FROM Seat) THEN id
        WHEN MOD(id, 2) = 1 THEN id+1
        ELSE id-1
    END AS id,
    student
FROM Seat
ORDER BY id;

아이디어

기초기초 내용이지만,! WHEN THEN절 뒤에 , 붙이지 않기,,ㅎ

yeongleej commented 3 weeks ago

문제: 1174. Immediate Food Delivery II

설명

코드

select round(count(customer_id)/(select count(distinct customer_id) from delivery), 4)*100 as immediate_percentage
from delivery
where order_date = customer_pref_delivery_date
      and (customer_id, order_date) in (select customer_id, min(order_date) from delivery group by customer_id)

아이디어

KodaHye commented 3 weeks ago

문제: 대장균의 크기에 따라 분류하기 2

설명

코드

WITH TMP AS (
    SELECT ID,
        PERCENT_RANK() OVER 
        (ORDER BY SIZE_OF_COLONY DESC) AS SIZE_RANK
    FROM ECOLI_DATA
)

SELECT ID,
    CASE 
        WHEN SIZE_RANK <= 0.25 THEN 'CRITICAL'
        WHEN SIZE_RANK <= 0.50 THEN 'HIGH'
        WHEN SIZE_RANK <= 0.75 THEN 'MEDIUM'
        ELSE 'LOW'
    END AS COLONY_NAME
FROM TMP
ORDER BY ID

아이디어

KodaHye commented 2 weeks ago

문제: 그룹별 조건에 맞는 식당 목록 출력하기

설명

코드

WITH TMP AS(
    SELECT MEMBER_ID
         , COUNT(*) `CNT`
         , RANK() OVER (ORDER BY COUNT(*) DESC) AS RNK
         , REVIEW_DATE
         , REVIEW_TEXT
    FROM REST_REVIEW
    GROUP BY MEMBER_ID
)

SELECT B.MEMBER_NAME, A.REVIEW_TEXT, DATE_FORMAT(A.REVIEW_DATE, '%Y-%m-%d') `REVIEW_DATE`
FROM REST_REVIEW A
JOIN MEMBER_PROFILE B USING(MEMBER_ID)
JOIN TMP C USING(MEMBER_ID)
WHERE C.RNK = 1
ORDER BY A.REVIEW_DATE ASC, A.REVIEW_TEXT ASC

아이디어

Jewan1120 commented 2 weeks ago

문제: 조건에 부합하는 중고거래 상태 조회하기

설명

코드

SELECT
    BOARD_ID
    , WRITER_ID
    , TITLE
    , PRICE
    , CASE
        WHEN STATUS = 'SALE' THEN '판매중'
        WHEN STATUS = 'RESERVED' THEN '예약중'
        WHEN STATUS = 'DONE' THEN '거래완료'
    END STATUS
FROM
    USED_GOODS_BOARD
WHERE
    CREATED_DATE = '2022-10-05'

아이디어

yeahdy commented 2 weeks ago

문제: 조건에 맞는 사용자 정보 조회하기

설명

코드

SELECT 
    ugu.USER_ID, 
    ugu.NICKNAME, 
    CONCAT(ugu.CITY," ",ugu.STREET_ADDRESS1," ",ugu.STREET_ADDRESS2) '전체주소',
    CONCAT(LEFT(ugu.TLNO, 3), '-', MID(ugu.TLNO, 4, 4), '-', RIGHT(ugu.TLNO, 4)) '전화번호'
FROM USED_GOODS_USER ugu
INNER JOIN
(
    SELECT WRITER_ID
    FROM USED_GOODS_BOARD
    GROUP BY WRITER_ID
    HAVING COUNT(WRITER_ID) > 2
) sub
ON ugu.USER_ID = sub.WRITER_ID
ORDER BY USER_ID DESC;

아이디어