공부/SQL(33)
-
[SQL] Programmers - 자동차 평균 대여기간 구하기 <GROUP BY, HAVING, DATE>
문제를 풀기 앞서.. 나는 멍청하고 같은 실수를 반복했다. Problem Solution 문제를 제대로 읽어보지 않았다. 아래의 쿼리문은 내가 처음에 신나게 작성했던 실수덩어리다. SELECT CAR_ID, ROUND(AVG(DATEDIFF(END_DATE, START_DATE)+1), 1) AS AVERAGE_DURATION FROM CAR_RENTAL_COMPANY_RENTAL_HISTORY WHERE DATEDIFF(END_DATE, START_DATE)+1 >=7 GROUP BY CAR_ID ORDER BY AVERAGE_DURATION DESC, CAR_ID DESC; 이전에 사용해본적이 있엇던 DATEDIFF 함수를 사용하면 되겠다는 생각에 문제를 제대로 읽어보지도 않았다. 위 쿼리문을 해석해..
2023.04.09 -
[SQL] Programmers -상품을 구매한 회원 비율 구하기 <GROUP BY, WHERE, INNER JOIN, SUBQUERY>
Problem Programmers 에서 처음 풀어보는 LV5 문제다. 대충 읽어보니 그리 어려울것 같지는 않다. Solution SELECT YEAR(u.JOINED) AS YEAR, MONTH(u.JOINED) AS MONTH, COUNT(DISTINCT o.USER_ID) AS PURCHASED_USERS, ROUND( ( COUNT(DISTINCT(o.USER_ID)) / ( SELECT COUNT(USER_ID) FROM USER_INFO WHERE YEAR(JOINED) = 2021 ) ), 1 ) AS PURCHASED_RATIO FROM ONLINE_SALE o INNER JOIN USER_INFO u ON u.USER_ID = o.USER_ID WHERE YEAR(u.JOINED) = 2..
2023.04.09 -
[SQL] Programmers - 상품별 오프라인 매출 구하기 <GROUP BY>
Problem Solution 어이가 없어서 글을 작성한다.. 풀이 단계는 아래와 같았다. 1. PRODUCT 테이블과 OFFLINE_SALE 테이블을 조인 시켜야 해당 상품 코드의 매출액을 구할 수 있을것이고, 두 테이블에서 공통되는 컬럼 PRODUCT_ID가 존재하는걸 확인하고 INNER JOIN으로 원하는 데이터 셋을 뽑을 수 있을것 같았다. 2. '상품코드 별' => GROUP BY PRODUCT_CODE 3. 매출액 => SALES_AMOUNT * PRICE AS SALES 4. ORDER BY SALES DESC, PRODUCT_CODE ASC; SELECT PRODUCT_CODE, SALES_AMOUNT * PRICE AS SALES FROM PRODUCT p INNER JOIN OFFLIN..
2023.04.08 -
[SQL] Programmers - 나이 정보가 NULL 회원 수 구하기 <NULL, COUNT, SUM>
Problem WHERE 구의 조건을 활용한 풀이 COUNT 함수를 사용할 때는 전체(*)를 대상으로 할 때 주의해야 합니다. COUNT(*)는 NULL 값을 포함하고 COUNT(AGE)와 같이 특정 컬럼을 지정해줄 경우 NULL 값을 포함하지 않기 때문입니다. 이 문제에서는 WHERE 구에서 이미 조건을 수행하기 때문에 괜찮지만 다른 문제에서는 주의하시면 좋을 것 같습니다. SELECT COUNT(USER_ID) AS USERS FROM USER_INFO WHERE AGE IS NULL; 예를 들어 이 문제에서 아래 쿼리와 SELECT COUNT(*) AS USERS FROM USER_INFO; 아래 쿼리는 반환하는 결괏값이 다릅니다. SELECT COUNT(AGE) AS USERS FROM USER_..
2023.04.08 -
[SQL] Programmer - 입양시각 구하기(2) <GROUP BY, SET @>
Problem Solution SELECT HOUR(DATETIME) AS HOUR, IFNULL(COUNT(DISTINCT(ANIMAL_ID)), 0) AS COUNT FROM ANIMAL_OUTS GROUP BY HOUR ORDER BY HOUR COUNT 가 NULL 값인 경우에 0을 반환하게 했음에도 불구하고, HOUR 칼럼의 모든 ROW가 출력되지 않았다. 도대체 왜 IFNULL() 함수가 제대로 동작하지 않는지... 궁금해서 HOUR를 모두 출력해보았다. 단순한 GROUP BY 문제인줄 알았던 나의 착각. 그러면 DB에 존재하지 않는 HOUR를 생성해야하는게 우선일것 같다. 0부터 23까지의 HOUR가 있는 테이블을 생성하고 ANIMAL_OUTS 테이블에서 그걸 사용해야하나보다. 요건 해본적이..
2023.04.07 -
[SQL] Programmers - 년, 월, 성별 별 상품 구매 회원 수 구하기 <GROUP BY, INNER JOIN, COUNT>
Problem Solution USER_INFO 테이블과 ONLINE_SALE 테이블은 USER_ID로 JOIN을 하면 문제를 쉽게 해결 할 수 잇을것 같다. SELECT * FROM USER_INFO u INNER JOIN ONLINE_SALE o ON u.USER_ID = o.USER_ID 이제 이 테이블에서 년, 월, 성별 별로 상품을 구매한 회원의 숫자를 출력해야한다. 이 말은 GROUP BY YEAR, MONTH, GENDER 이라고 해석하면 된다. 여기까진 매우 쉽다. SELECT YEAR(o.SALES_DATE) AS YEAR, MONTH(o.SALES_DATE) AS MONTH, u.GENDER, COUNT(DISTINCT(o.USER_ID)) FROM USER_INFO u INNER JO..
2023.04.07