GreatAlgorithm-Study / AlgorithmStudy

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

[7주차_SQL] SQL 풀이 모음 #88

Closed KodaHye closed 3 weeks ago

KodaHye commented 1 month ago
## 문제: [문제명](링크)

### 설명

### 코드

### 아이디어
icegosimperson commented 1 month ago

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

설명

2022년 1월의 카테고리 별 도서 판매량을 합산하고, 카테고리(CATEGORY), 총 판매량(TOTAL_SALES) 리스트를 출력 정렬 :카테고리명을 기준으로 오름차순

코드

SELECT a.CATEGORY, SUM(b.SALES) AS TOTAL_SALES
FROM BOOK a
JOIN BOOK_SALES b ON a.BOOK_ID=b.BOOK_ID
WHERE b.SALES_DATE LIKE '2022-01%'
GROUP BY a.CATEGORY
ORDER BY a.CATEGORY;

아이디어

KodaHye commented 1 month ago

문제: 저자 별 카테고리 별 매출액 집계하기

설명

도서 정보, 저자 정보, 판매량 정보가 있는 테이블이 있을 때, 2022년 1월 도서 별 총 매출액 구하기

코드

SELECT A.AUTHOR_ID, B.AUTHOR_NAME, A.CATEGORY, SUM(C.SALES * A.PRICE) `TOTAL_SALES`
FROM BOOK A
JOIN AUTHOR B ON A.AUTHOR_ID = B.AUTHOR_ID
JOIN BOOK_SALES C ON A.BOOK_ID = C.BOOK_ID
WHERE YEAR(C.SALES_DATE) = 2022 AND MONTH(C.SALES_DATE) = 1
GROUP BY A.AUTHOR_ID, A.CATEGORY
ORDER BY A.AUTHOR_ID ASC, A.CATEGORY DESC

아이디어

SUM(C.SALES * A.PRICE)SUM(C.SALES) * A.PRICE의 값이 다를 수 있다는거 주의하기!

baexxbin commented 1 month ago

문제: 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) AS year
    FROM Sales
    GROUP BY product_id
)

아이디어

yeahdy commented 1 month ago

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

설명

코드

WITH RECURSIVE time_h AS (
  SELECT 0 AS HOUR_DATA
  UNION ALL
  SELECT HOUR_DATA+1 
    FROM time_h
   WHERE HOUR_DATA < 23
)
SELECT
    th.HOUR_DATA AS HOUR
    ,COUNT(DISTINCT ao.ANIMAL_ID) AS COUNT
FROM time_h th
LEFT JOIN ANIMAL_OUTS ao
ON th.HOUR_DATA = HOUR(ao.DATETIME)
GROUP BY th.HOUR_DATA
ORDER BY th.HOUR_DATA;

아이디어

ROW_NUMBER() OVER() 를 활용한 코드

각 행에 대해 고유한 순번을 반환하고, 기본값은 1부터 시작

SELECT
    h.HOUR
    ,COUNT(DISTINCT ao.ANIMAL_ID) AS COUNT
FROM (
    SELECT ROW_NUMBER() OVER()-1 AS HOUR
    FROM ANIMAL_OUTS
    LIMIT 24
) h
LEFT JOIN ANIMAL_OUTS ao
ON h.HOUR = HOUR(ao.DATETIME)
GROUP BY h.HOUR
ORDER BY h.HOUR;
Jewan1120 commented 1 month ago

문제: 1070. Product Sales Analysis III

설명

코드

SELECT
    product_id 
    , year `first_year`
    , quantity
    , price
FROM
    Sales
WHERE (product_id, year) in (
        SELECT
            product_id
            , MIN(year) min_Year
        FROM
            Sales
        GROUP BY
            product_id
    )

아이디어

yeongleej commented 1 month ago

문제: Customers Who Bought All Products

설명

=> 상품 리스트의 모든 상품을 구매한 고객들을 출력

코드

select customer_id
from customer
group by customer_id
having count(distinct product_key) = (select count(product_key) from product)

아이디어

yeongleej commented 4 weeks ago

문제: Biggest Single Number

설명

코드

select max(num) as num
from (
    select num
    from mynumbers
    group by num
    having count(num) = 1
) my

아이디어

저는 요즘 sql 풀 때 max() 활용하는게 어려운것 같아요,,,, max() 활용사례를 더 공부해야겠습니다~ 😢

baexxbin commented 4 weeks ago

문제: 178. Rank Scores

설명

코드 & 아이디어


yeahdy commented 4 weeks ago

문제: 연간 평가점수에 해당하는 평가 등급 및 성과금 조회하기

설명

평가 점수별 등급과 등급에 따른 사번, 성명, 평가 등급, 성과금을 조회

기준 점수 평가 등급 성과금(연봉 기준)
96 이상 S 20%
90 이상 A 15%
80 이상 B 10%
이외 C 0%

평가등급의 컬럼명은 GRADE로, 성과금의 컬럼명은 BONUS 사번 기준으로 오름차순 정렬

코드

SELECT
    hem.EMP_NO,
    hem.EMP_NAME,
    CASE
        WHEN sub.average >= 96 THEN 'S'
        WHEN sub.average >= 90 THEN 'A'
        WHEN sub.average >= 80 THEN 'B'
        ELSE 'C'
        END AS GRADE,
    CASE
        WHEN sub.average >= 96 THEN hem.SAL*0.2
        WHEN sub.average >= 90 THEN hem.SAL*0.15
        WHEN sub.average >= 80 THEN hem.SAL*0.1
        ELSE 0
        END AS BONUS
FROM HR_EMPLOYEES hem
INNER JOIN (
    SELECT
        hg.EMP_NO,
        SUM(hg.SCORE)/2 AS average
    FROM HR_GRADE hg
    INNER JOIN HR_EMPLOYEES he
    ON hg.EMP_NO = he.EMP_NO
    GROUP BY hg.EMP_NO
) sub
ON hem.EMP_NO = sub.EMP_NO

아이디어

icegosimperson commented 4 weeks ago

문제: 대여 횟수가 많은 자동차들의 월별 대여 횟수 구하기

설명

코드

SELECT MONTH(START_DATE) AS MONTH, CAR_ID, COUNT(HISTORY_ID) AS RECORDS
FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
WHERE START_DATE >= '2022-08-01' and START_DATE  < '2022-11-01' and 
    CAR_ID IN (SELECT CAR_ID
               FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
               WHERE START_DATE >= '2022-08-01' AND START_DATE <'2022-11-01'
               GROUP BY CAR_ID HAVING COUNT(HISTORY_ID) > 4)
GROUP BY MONTH, CAR_ID
HAVING RECORDS > 0
ORDER BY MONTH ASC, CAR_ID DESC;

아이디어

시작일을 기준으로 2022년 8월부터 2022년 10월까지 총 대여 횟수가 5회 이상인 자동차들

KodaHye commented 4 weeks ago

문제: 즐겨찾기가 가장 많은 식당 정보 출력하기

설명

식당의 정보가 있는 REST_INFO 테이블을 통해 음식 종류별로 즐거찾기 수가 가장 많은 식당의 정보 출력하기

코드

오답코드 즐겨찾기의 값은 가장 큰 값이 나올 수 있으나, ID, 음식 이름이 해당 즐겨찾기에 대한 식당 정보가 아닐 수 있음

SELECT FOOD_TYPE, REST_ID, REST_NAME, MAX(FAVORITES) `FAVORITES`
FROM REST_INFO
GROUP BY FOOD_TYPE
ORDER BY FOOD_TYPE DESC


정답코드 (1) 서브쿼리 사용

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES
FROM REST_INFO A
WHERE (FOOD_TYPE, FAVORITES) IN (
SELECT FOOD_TYPE, MAX(FAVORITES)
FROM REST_INFO
GROUP BY FOOD_TYPE
)
ORDER BY FOOD_TYPE DESC


정답코드 (2) RANK 함수 사용


WITH TMP AS (
SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES,
#   ROW_NUMBER(): 행 번호 표시
#   PARTITION BY FOOD_TYPE: FOOD_TYPE 별로 순위를 나눔
ROW_NUMBER() OVER (PARTITION BY FOOD_TYPE ORDER BY FAVORITES DESC, REST_ID) AS RANK_FAVOIRTES
FROM REST_INFO
)

SELECT FOOD_TYPE, REST_ID, REST_NAME, FAVORITES FROM TMP WHERE RANK_FAVOIRTES = 1 ORDER BY FOOD_TYPE DESC


<BR>

> TMP 결과

![image](https://github.com/user-attachments/assets/bc7a66fe-3448-4ee3-8d53-31a61ca7c2d7)

### 아이디어
* 단순히 `GROUP BY`를 한 후, 내가 원하는 값만 `MAX`를 하면 안됨
* 서브쿼리나 `OVER` 함수 사용하기
Jewan1120 commented 4 weeks ago

문제: 619. Biggest Single Number

설명

+-------------+------+
| Column Name | Type |
+-------------+------+
| num         | int  |
+-------------+------+

코드