GreatAlgorithm-Study / AlgorithmStudy

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

[11주차_SQL] SQL 풀이 모음 #150

Open yeongleej opened 4 days ago

yeongleej commented 4 days ago

추천문제와 전주의 본인 순번 전 사람이 풀었던 문제 입니다.

## 문제: [문제명](링크)

### 설명

### 코드

### 아이디어
yeahdy commented 2 days ago

문제: 자동차 대여 기록 별 대여 금액 구하기

설명

코드

SELECT 
    ch.HISTORY_ID,
    IF(DISCOUNT_RATE IS NULL, 
       daily_fee * FEE, 
       FLOOR((daily_fee * FEE)*(1-(DISCOUNT_RATE/100)))) FEE
FROM CAR_RENTAL_COMPANY_CAR cc
INNER JOIN (
    SELECT HISTORY_ID, CAR_ID, TIMESTAMPDIFF(DAY,START_DATE,END_DATE)+1 FEE
    FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY
) ch
ON cc.CAR_ID = ch.CAR_ID
LEFT JOIN (
    SELECT SUBSTRING_INDEX(DURATION_TYPE,'일',1) DAY,
            SUBSTRING_INDEX(DISCOUNT_RATE,'%',1) DISCOUNT_RATE
    FROM CAR_RENTAL_COMPANY_DISCOUNT_PLAN
    WHERE CAR_TYPE = '트럭'
) cp
ON (CASE 
        WHEN ch.FEE BETWEEN 7 AND 30 THEN 7
        WHEN ch.FEE BETWEEN 30 AND 90 THEN 30
        WHEN ch.FEE >= 90 THEN 90
    END) = cp.DAY
WHERE cc.CAR_TYPE = '트럭'
ORDER BY FEE DESC, HISTORY_ID DESC;

아이디어

baexxbin commented 2 days ago

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

설명

코드

SELECT b.AUTHOR_ID, a.AUTHOR_NAME, b.CATEGORY,
        SUM(s.SALES*b.PRICE) AS TOTAL_SALES
FROM BOOK b
JOIN AUTHOR a ON b.AUTHOR_ID = a.AUTHOR_ID
JOIN BOOK_SALES s ON b.BOOK_ID = s.BOOK_ID
WHERE DATE_FORMAT(s.SALES_DATE, '%Y-%m') = '2022-01'
GROUP BY b.AUTHOR_ID, a.AUTHOR_NAME, b.CATEGORY
ORDER BY b.AUTHOR_ID, b.CATEGORY DESC;

아이디어

yeongleej commented 11 hours ago

문제: 멸종위기의 대장균 찾기

설명

=> 각 개체의 세대를 찾아야 함 => 자식이 없는 개체를 찾아야 함

코드

WITH RECURSIVE GEN_DATA AS(
    SELECT ID, 1 AS GENERATION
    FROM ECOLI_DATA
    WHERE PARENT_ID IS NULL
    UNION ALL
    SELECT E.ID, G.GENERATION+1
    FROM GEN_DATA G
    JOIN ECOLI_DATA E
    ON G.ID = E.PARENT_ID
)

SELECT COUNT(P.ID) AS COUNT, G.GENERATION
FROM ECOLI_DATA P
JOIN GEN_DATA G
ON P.ID = G.ID
LEFT JOIN ECOLI_DATA C
ON P.ID = C.PARENT_ID
WHERE C.ID IS NULL
GROUP BY G.GENERATION
ORDER BY G.GENERATION

아이디어


- 부모가 없는 세대를 1세대로 시작으로 다음 세대를 차례대로 구하기
![image](https://github.com/user-attachments/assets/08590b88-967f-4fdc-9f5d-498867b3f69c)

- 자식이 없는 개체 찾기
    - **SELF JOIN**으로 자식이 없는 개체 찾기
    - `p.id` : 부모 개체의 ID
    - `c.parent_id` : 자식의 부모 ID
    - 부모 테이블 기준으로 left join하면 자식이 없는 부모의 자식 id 값은 null이 됨
![image](https://github.com/user-attachments/assets/620cb06e-4e5c-4160-a922-763f8c4f1e87)
icegosimperson commented 6 hours ago

문제: Department Top Three Salaries

설명

각 부서 고소득 직원 찾기 고소득 기준 : 해당 부서의 상위 3개 고유 급여에 포함

코드

SELECT t.department, t.employee, t.salary
FROM (
         SELECT d.name AS department,
                e.name AS employee,
                e.salary AS Salary,
                DENSE_RANK() OVER (PARTITION BY departmentId ORDER BY salary DESC) AS dr
         FROM employee e
                  JOIN Department d ON e.departmentId=d.id
     ) t
WHERE t.dr<=3;

아이디어

부셔별 상위 급여를 먼저 순위 매기고 조건 추가

1) 부셔별 상위 급여 : DENSE_RANK() 2) PARTITION BY로 부서별 데이터 나누기

DENSE_RANK() OVER (PARTITION BY departmentId ORDER BY salary DESC) AS dr

3) 인라인 뷰로 순위를 한번만 계산

SELECT column_list
FROM (SELECT * FROM table_name) [alias]
WHERE 조건식;
KodaHye commented 3 hours ago

문제: Second Highest Salary

설명

코드

SELECT MAX(SALARY) AS `SecondHighestSalary`
FROM EMPLOYEE
WHERE SALARY < (SELECT MAX(SALARY) FROM EMPLOYEE)

아이디어

혜원님이 저번에 알려주신 OFFSET, LIMIT을 사용하는게 제일 깔끔한 풀이 같습니다. 근데 해커랭크에서 아무 값도 나오지 않아야 될 때, null이라는 글자를 따로 출력해야되는건가요??? 코드가 틀린건가요?!? image