Q. ONLINE_SALE 테이블과 OFFLINE_SALE 테이블에서 2022년 3월의 오프라인/온라인 상품 판매 데이터의 판매 날짜, 상품ID, 유저ID, 판매량을 출력하는 SQL문을 작성해주세요.
OFFLINE_SALE 테이블의 판매 데이터의 USER_ID 값은 NULL 로 표시해주세요.
결과는 판매일을 기준으로 오름차순 정렬해주시고 판매일이 같다면 상품 ID를 기준으로 오름차순, 상품ID까지 같다면 유저 ID를 기준으로 오름차순 정렬해주세요.
(정답)
SELECT
date_format(SALES_DATE,'%Y-%m-%d') AS SALES_DATE,
product_id,
NULL AS USER_ID,
sales_amount
FROM
OFFLINE_SALE
WHERE
date_format(SALES_DATE,'%Y-%m')='2022-03'
UNION ALL
SELECT
date_format(SALES_DATE,'%Y-%m-%d') AS SALES_DATE,
PRODUCT_ID,
USER_ID,
SALES_AMOUNT
FROM
ONLINE_SALE
WHERE
date_format(SALES_DATE,'%Y-%m')='2022-03'
ORDER BY
SALES_DATE,
PRODUCT_ID,
USER_ID
UNION 은 조회할 두 테이블의 컬럼수가 같아야 한다는 것을 처음 알게되었다.
만약 같지 않다면, NULL as (대체 컬럼명) 으로 숫자를 맞출 수 있다고 한다.
Q. 보호소에서는 몇 시에 입양이 가장 활발하게 일어나는지 알아보려 합니다.
0시부터 23시까지, 각 시간대별로 입양이 몇 건이나 발생했는지 조회하는 SQL문을 작성해주세요.
이때 결과는 시간대 순으로 정렬해야 합니다.
웬일로 쉬운 문제냐! 하고 신나게 풀었는데 결과는 오답.
뭐가 문제인지 확인해보니 결과값에 count로 집계되는게 없더라도 hour 컬럼이 나와야 한단다.
또 새로운 문법을 알게되었다.
RECURSIVE (+ WITH) 재귀쿼리
재귀(recursion)는 어떠한 것을 정의할 때 자기 자신을 참조하는 것을 뜻한다.
자기언급과도 관련된 재귀는 언어학에서 논리학에 이르기까지 다양한 분야에서 연구되는 주제로,
특히 컴퓨터 과학과 수학에서, 재귀는 함수가 자신의 정의에 의해 정의될 때의 개념을 가리킨다. (출처_wiki)
with recursive 쿼리문을 작성하고 내부에 union을 통해 재귀를 구성하는 것이 포인트.
(문법 예)
WITH RECURSIVE cte_count
AS (
-- Non-Recursive 문장( 첫번째 루프에서만 실행됨 )
SELECT 1 AS n
UNION ALL
-- Recursive 문장(읽어 올 때마다 행의 위치가 기억되어 다음번 읽어 올 때 다음 행으로 이동함)
SELECT n + 1 AS num
FROM cte_count
WHERE n < 3
)
SELECT * FROM test;
(정답)
with recursive rc as (
select 0 as hour
union all
select hour+1 from rc where hour<23
)
select
rc.hour,
count(hour(A.datetime)) as count
from rc
left join animal_ins as A
on rc.hour = hour(A.datetime) -- 재귀숫자와 datetime시간숫자가 같은것 만
group by rc.hour -- 집계함수를 썼으니 그룹핑, 안그러면 다 더해서 레코드 하나만 반환