문제: USED_GOODS_BOARD와 USED_GOODS_USER 테이블에서 중고 거래 게시물을 3건 이상 등록한 사용자의 사용자 ID, 닉네임, 전체주소, 전화번호를 조회하는 SQL문을 작성해주세요. 이때, 전체 주소는 시, 도로명 주소, 상세 주소가 함께 출력되도록 해주시고, 전화번호의 경우 xxx-xxxx-xxxx 같은 형태로 하이픈 문자열(-)을 삽입하여 출력해주세요. 결과는 회원 ID를 기준으로 내림차순 정렬해주세요.
https://school.programmers.co.kr/learn/courses/30/lessons/164670
#풀이 1
select u.user_id,
u.nickname,
CONCAT(u.city,' ',u.street_address1,' ',u.street_address2) AS 전체주소,
CONCAT(substr(u.tlno,1,3),'-',substr(u.tlno,4,4),'-',substr(u.tlno,8,4)) AS 전화번호
from used_goods_board b join used_goods_user u on b.writer_id=u.user_id
group by u.user_id,
u.nickname,
u.city, u.street_address1, u.street_address2,
u.tlno
having count(b.board_id) >= 3
order by u.user_id desc;
#풀이 2
select a.user_id,
a.nickname,
CONCAT(a.city,' ', a.street_address1,' ', a.street_address2) as '전체주소',
CONCAT(substr(a.tlno,1,3),'-',substr(a.tlno,4,4),'-',substr(a.tlno,8,4)) as '전화번호'
from
(select u.user_id,
u.nickname,
u.city,
u.street_address1, u.street_address2,
u.tlno,
count(b.writer_id)
from used_goods_board b join used_goods_user u on b.writer_id=u.user_id
group by 1, 2, 3, 4, 5, 6
having count(b.writer_id) >= 3
) as a
order by a.user_id desc
명시적인 컬럼 나열:
GROUP BY에 포함되는 모든 컬럼은 SELECT 문에 있는 각 컬럼을 정확히 지정해야 한다. CONCAT의 결과가 GROUP BY에 포함될 때 이를 분해하여 실제 컬럼들을 명시적으로 다루어야 하므로, u.city, u.street_address1, u.street_address2 등을 각각 나열해야 한다.
집계 함수와 GROUP BY:
GROUP BY는 집계 함수와 함께 사용하여 데이터를 그룹화하는데, 여러 개의 컬럼이 결합된 결과는 GROUP BY 절에서 원본 컬럼들의 집합을 다루는 것으로 생각해야 한다.
-> 집계 함수(COUNT(), SUM(), AVG(), MAX(), MIN() 등)를 사용하는 경우, GROUP BY 절에는 그룹화하려는 컬럼을 그대로 나열해야 한다는 원칙이 있다.