목록mysql (24)
오랑우탄의 반란
오늘도 오랑이는 문제를 풉니다. 1193. Monthly Transactions I 풀이 과정우선 간단한 조건부터 정리해서 써줍니다.select date_format(trans_date ,'%Y-%m') as month, country, count(id) as trans_count, /*QUERY*/ as approved_count, sum(amount) as trans_total_amount, /*QUERY*/ as approved_total_amountfrom transactionsgroup by 1, 2 ; approved_count 와 approved_total_amount 는 각각 state = 'approved' 라는 조건이 필요한데, ..
오늘도 오랑이는 문제를 풉니다. 특정 기간동안 대여 가능한 자동차들의 대여비용 구하기문제CAR_RENTAL_COMPANY_CAR CAR_RENTAL_COMPANY_RENTAL_HISTORY CAR_RENTAL_COMPANY_DISCOUNT_PLAN 1. 자동차 종류가 '세단' 또는 'SUV' 인 자동차 중 WHERE CAR_TYPE IN ('세단', 'SUV')2. 2022년 11월 1일부터 2022년 11월 30일까지 대여 가능하고 START_DATE, END_DATE 조건3. 30일간의 대여 금액이 50만원 이상 200만원 미만인 자동차에 대해서 FEE BETWEEN 50만 AND 200만4. 자동차 ID, 자동차 종류, 대여 금액(컬럼명: FEE) 리스트를 출력 SELECT CAR_ID, ..
오늘도 오랑이는 문제를 풉니다. 1251. Average Selling Price 풀이 과정문제를 제대로 읽고 파악합시다. 처음 작성한 코드는 아래와 같았는데 틀렸습니다. 왜 그런가 단계별로 쿼리를 돌려보며 살펴봤는데 JOIN 했을 때 모든 테이블을 뽑아보니 product_id 별로 값이 중복으로 출력되는 것을 봤습니다. 즉, 제대로 JOIN 이 안 되었다는 걸 알 수 있지요. SELECT p.product_id, round(sum(units*price)/sum(units),2) as average_priceFROM prices p JOIN unitssold u ON p.product_id = u.product_id GROUP BY p.product_id 문제를 다시 살펴봅니다. 1. 조건 이슈ave..
오늘도 오랑이는 문제를 풉니다. 1934. Confirmation Rate 조인을 활용해서 쉽게 풀 수 있는 문제입니다. SELECT s.user_id , round(ifnull(c2.confirm / c1.total,0),2) AS confirmation_rateFROM signups s left join (select user_id, count(*) as total from confirmations group by 1) c1 on s.user_id = c1.user_id left join (select user_id, count(*) as confirm from confirmations where action = 'confirmed' group by 1) c2 ..
오늘도 오랑이는 문제를 풉니다. 기존 입양 시각 구하기 1 문제와 동일한 대신, HOUR 가 0~23까지 전부 표시되는 형식으로 출력되게 하는 문제입니다. 푸는 방법을 몰라서 오늘도 열심히 구글링 해봅니다. 입양 시각 구하기(2) 우선 기존 코드는 아래와 같습니다. 간단하죠?이렇게 하면 HOUR 가 7~19인 값에 대해서만 출력이 됩니다. IFNULL 을 사용해서 값이 없을 때 0으로 표시되도록 쿼리를 짜도, 애초에 HOUR 값이 없기 때문에 최종 결과물에 표시되지 않는 것을 보실 수 있습니다. SELECT HOUR(DATETIME) AS HOUR, IFNULL(COUNT(1),0) AS COUNTFROM ANIMAL_OUTSGROUP BY 1ORDER BY 1 그렇기 때문에 해당 문제를 풀기 위해서..
오늘도 오랑이는 문제를 풉니다. 570. Managers with at Least 5 Direct Reports 셀프조인을 사용해서 풀 수 있는 간단한 문제입니다.SELECT E1.NAMEFROM EMPLOYEE E1 JOIN EMPLOYEE E2 ON E1.ID = E2.MANAGERIDGROUP BY E1.ID, E1.NAMEHAVING COUNT(E2.MANAGERID) >= 5; 하지만 주말 동안 뇌를 비운 오랑이는 순간 착각하고 멍청한 실수를 해버립니다.HAVING COUNT(DISTINCT E2.MANAGERID) 로 작성해서 틀려버렸습니다.공통 값에 대해 JOIN 되고 GROUP BY 로 묶였기 때문에 E2.MANAGERID 칼럼의 값들은 NULL 값 제외, 그리고 E1.ID 와 E1.N..
테이블을 자기 자신과 조인하는 셀프 조인에 대해 알아보겠습니다. SELF JOIN은 한 테이블 내에서 칼럼 간, 개별 값 간 대조가 필요할 때 사용할 수 있습니다. 문법은 JOIN/쉼표로 연결하고 (필수) 별칭을 붙여줍니다.SELECT column_name(s)FROM table1 T1, table1 T2WHERE condition; 아래 두 가지 예시로 SELF JOIN의 활용을 살펴보겠습니다. LeetCode | 197. Rising Temperaturehttps://leetcode.com/problems/rising-temperature/ 하나의 테이블 내의 날짜 값과 온도 값에 대한 비교가 필요하기 때문에 self join 을 사용해서 이어줍니다. from weather w1 join we..
오늘도 오랑이는 문제를 풉니다. 동명 동물 수 찾기 풀이 과정예전에 풀었던 문제를 다시 살펴봤습니다. 기존 쿼리와 새로 작성한 쿼리를 비교해보면 having 으로 훨씬 간편하게 푼 걸 볼 수 있습니다. 다만 두번째 풀이에서 처음에 COUNT(*) 로 해서 오답이 나왔는데, 문제에서 NULL 값은 제외하라는 조건을 유의해서 COUNT(NAME) 으로 변경해야 정답이 나옵니다. COUNT(칼럼) 은 NULL 값 제외하고 집계됨 COUNT(*) 은 NULL 값의 행도 모두 집계됨 최종 코드# AFTERSELECT NAME, COUNT(NAME) AS COUNTFROM ANIMAL_INSGROUP BY 1HAVING COUNT(NAME) >=2ORDER BY 1# BEFORESELECT NAME, COUNTF..