Day35

강태훈·2026년 2월 19일

nbcamp TIL

목록 보기
35/58

SQL 코드카타

동명 동물 수 찾기

SELECT NAME, COUNT(NAME) AS 'COUNT'
FROM ANIMAL_INS
WHERE NAME IS NOT NULL
GROUP BY NAME
HAVING COUNT >= 2
ORDER BY NAME
;

HAVING

  • 문법 : HAVING + 조건식 (보통 GROUP BY 뒤에 사용)
  • 정의 : GROUP BY로 그룹화된 결과에 대해 조건을 적용할 때 사용하는 절(집계 결과를 필터링하는 용도)
구분WHEREHAVING
적용 시점그룹화 이전그룹화 이후
대상개별 행(row)그룹(group)
집계 함수 사용XO
GROUP BY 필요XO (보통 함께 사용)

년, 월, 성별 별 상품 구매 회원 수 구하기

SELECT YEAR(O.SALES_DATE) AS YEAR, 
MONTH(O.SALES_DATE) AS MONTH,
U.GENDER AS GENDER,
COUNT(DISTINCT U.USER_ID) AS USERS
FROM USER_INFO U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY YEAR(O.SALES_DATE),
MONTH(O.SALES_DATE),
U.GENDER
ORDER BY YEAR, MONTH, U.GENDER
;

↳ 내가 푼 코드
↱ 다른 답안

SELECT DATE_FORMAT(O.SALES_DATE, "%Y") YEAR,
DATE_FORMAT(O.SALES_DATE, "%m") MONTH,
U.GENDER, COUNT(DISTINCT U.USER_ID) USERS
FROM USER_INFO U
JOIN ONLINE_SALE O
ON U.USER_ID = O.USER_ID
WHERE U.GENDER IS NOT NULL
GROUP BY 1,2,3
ORDER BY YEAR, MONTH, GENDER;

입양 시각 구하기(2)

WITH RECURSIVE H AS(
SELECT 0 HOUR
UNION ALL
SELECT HOUR+1
FROM H
WHERE HOUR < 23
)
SELECT H.HOUR, COUNT(A.ANIMAL_ID) AS COUNT
FROM H
LEFT JOIN ANIMAL_OUTS A
ON H.HOUR = HOUR(A.DATETIME)
GROUP BY H.HOUR
ORDER BY H.HOUR
;

그대로 만들면 입양되지 않은 시간은 빠지기 때문에, WITH RECURSIVE를 사용해 0부터 23까지의 시간 리스트(H)를 생성
SELECT 0 HOUR로 시작값(0시)을 만들고 HOUR+1을 반복하여 23시까지 확장

0개의 댓글