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로 그룹화된 결과에 대해 조건을 적용할 때 사용하는 절(집계 결과를 필터링하는 용도)| 구분 | WHERE | HAVING |
|---|---|---|
| 적용 시점 | 그룹화 이전 | 그룹화 이후 |
| 대상 | 개별 행(row) | 그룹(group) |
| 집계 함수 사용 | X | O |
| GROUP BY 필요 | X | O (보통 함께 사용) |
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;
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시까지 확장