관리 메뉴

물 만날 물고기

[프로그래머스/SQL] - (5) 조건에 맞는 사용자와 총 거래금액 조회하기 본문

DB & SQL/프로그래머스

[프로그래머스/SQL] - (5) 조건에 맞는 사용자와 총 거래금액 조회하기

Lung Fish 2023. 6. 23. 22:36

 

🔍 예상 검색어

더보기

# 조건에 맞는 사용자와 총 거래금액 조회하기

# SQL 

# MYSQL

# 프로그래머스


해당 포스팅은 프로그래머스 SQL "조건에 맞는 사용자와 총 거래금액 조회하기" 문제 풀이에 대하여 정리하였습니다.

 

▶ 문제

 

 

코딩테스트 연습 - 조건에 맞는 사용자와 총 거래금액 조회하기 | 프로그래머스 스쿨

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

▶ 내 정답

-- 코드를 입력하세요

-- USED_GOODS_BOARD AS B
-- BOARD_ID, *WRITER_ID, TITLE, CONTENTS, PRICE, CREATED_DATE, STATUS, VIEWS
-- 게시글 ID, 작성자 ID, 게시글 제목, 게시글 내용, 가격, 작성일, 거래상태, 조회수

-- USED_GOODS_USER AS U
-- *USER_ID, NICKNAME, CITY, STREET_ADDRESS1, STREET_ADDRESS2, TLNO
-- 회원 ID, 닉네임, 시, 도로명 주소, 상세 주소, 전화번호


-- 문제 조건
-- (1) 완료된 중고 거래의 총금액이 70만 원 이상 (GROUP BY)
-- (2) 총거래금액을 기준으로 오름차순 정렬

-- 결과테이블
-- U.USER_ID, U.NICKNAME, TOTAL_SALES(NEW+)

WITH 
TEMP_01 AS
(
SELECT B.WRITER_ID, B.STATUS, SUM(B.PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD AS B
WHERE STATUS = 'DONE'
GROUP BY WRITER_ID
)

SELECT U.USER_ID, U.NICKNAME, T.TOTAL_SALES
FROM USED_GOODS_USER AS U
LEFT JOIN TEMP_01 AS T
ON U.USER_ID = T.WRITER_ID
WHERE T.TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES ASC;

 

▶ 풀이설명

(1) 먼저 중고거래 STATUS 중 완료 된 값들로 필터링 먼저 진행하였고, GROUP BY 를 통해 TOTAL_SALES를 집계함

(2) (1)번 결과 테이블을 임시테이블로 지정 하였고, USED_GOODS_USER 테이블과 (1) 테이블을 JOIN 하였음

(3) WHERE 절을 이용해서 총 금액이 700,000이상인 조건으로 필터링하고 ORDER BY 절을 이용한 정렬 실시함

 

 

▶ 다른 분들 정답 (1)

SELECT U.user_id, U.nickname, SUM(B.price) AS TOTAL_SALES
FROM used_goods_user U
JOIN used_goods_board B ON U.user_id = B.writer_id
WHERE B.status = 'done'
GROUP BY U.user_id, U.nickname
HAVING TOTAL_SALES >= 700000
ORDER BY TOTAL_SALES ASC;

 

▶ 다른 분들 정답 (2)

-- 코드를 입력하세요
SELECT USER_ID, NICKNAME, SUM(PRICE) AS TOTAL_SALES
FROM USED_GOODS_BOARD, USED_GOODS_USER
WHERE WRITER_ID = USER_ID AND STATUS = "DONE"
GROUP BY USER_ID 
HAVING SUM(PRICE) >= 700000
ORDER BY TOTAL_SALES ASC

 

▶ 다른 분들 정답 (3)

-- WHERE 이용
SELECT USER_ID, NICKNAME, TOTAL_PRICE
FROM USED_GOODS_USER, (SELECT WRITER_ID, SUM(PRICE) AS TOTAL_PRICE
    FROM USED_GOODS_BOARD
    GROUP BY WRITER_ID,STATUS
    HAVING STATUS = 'DONE'
    AND SUM(PRICE) >= 700000) B
WHERE B.WRITER_ID = USER_ID
ORDER BY TOTAL_PRICE;

-- JOIN 이용
SELECT USER_ID, NICKNAME, TOTAL_PRICE
FROM USED_GOODS_USER
JOIN (SELECT WRITER_ID, SUM(PRICE) AS TOTAL_PRICE
    FROM USED_GOODS_BOARD
    GROUP BY WRITER_ID,STATUS
    HAVING STATUS = 'DONE'
    AND SUM(PRICE) >= 700000) B
ON B.WRITER_ID = USER_ID
ORDER BY TOTAL_PRICE;

 

▶ 총평

 

본인은 실수하지 않고, 최대한 결과나 나오는 방향으로 진행하기 위하여,

 

WITH 절을 이용해 임시 테이블을 선언하고, 이를 JOIN 하는 과정에서 WHERE 조건절을 사용하여 결과를 출력하였는데,

 

다른 분들의 결과를 확인해보니 GROUP BY 절과 HAVING 조건절을 이용하는 방법이 문제 취지에는 더 맞는 것 같다는 생각이 들었다. 

 

개인적으로 파이썬으로 코딩하는 습관 때문인지, 그때 그때 변수를 선언하면서 데이터를 핸들링 하는 것을 더 선호하는데 FROM 절에 SELECT로 테이블을 다시 만들어서 사용하는게, 실무자들 입장에서 가독성이 더 좋은지 아닌지를 잘 모르겠다. 실제 실무용 코드 작성은 어떤 방식을 선호하는지, 어떤 방식이 효율적인지를 확인해보도록 해야겠다.


▼ 참고자료

No. 내용 비고
1 my sql 쉬운답 | 프로그래머스 스쿨 haaaneeulll@gmail.com2023.6.4 01:28
2 프로그래머스 조건에 맞는 사용자와 총 거래 금액 조회하기 SQL(MySQL) 끄적끄적
3 mysql 정답 | 프로그래머스 스쿨 habibi2023.4.22 15:43