Q. 보호소의 동물이 중성화되었는지 아닌지 파악하려 합니다.
중성화된 동물은 SEX_UPON_INTAKE 컬럼에 'Neutered' 또는 'Spayed'라는 단어가 들어있습니다.
동물의 아이디와 이름, 중성화 여부를 아이디 순으로 조회하는 SQL문을 작성해주세요.
이때 중성화가 되어있다면 'O', 아니라면 'X'라고 표시해주세요.
문법을 대충 알면 생기는 일..
(내가 쓴 답=오답)
SELECT animal_id, name,
if(sex_upon_intake IN ('Neutered%', 'Spayed%'), "O", "X") "중성화"
from animal_ins
order by 1
대체 뭐가 잘못된 건지 모르겠었는데, 강의자료를 보면서 확인해보니
IN: '포함' 하는 조건 (%, _ 등의와일드카드사용 불가)
LIKE: 완전히 똑같지는 않지만, 비슷한 값을 조건으로 줌
따라서 내가 답으로 쓴 'Neutered%'를 쓰려면 in 이 아닌 와일드카드인 % 을 쓸 수 있는 like로 써야한다는 걸 다시금 알게되었다 😅😅
<정답>
(case when 문)
SELECT animal_id, name,
case when sex_upon_intake LIKE '%Neutered%' or sex_upon_intake LIKE '%Spayed%' then 'O'
else 'X' end "중성화"
from animal_ins
order by 1
--------
(if 문)
SELECT animal_id, name,
if(sex_upon_intake LIKE '%Neutered%' or sex_upon_intake LIKE '%Spayed%', 'O', 'X') "중성화"
from animal_ins
order by 1
--------
(regexp**)
SELECT animal_id, name,
if(sex_upon_intake REGEXP 'Neutered|Spayed', 'O', 'X') "중성화"
from animal_ins
order by 1
REGEXP (=Regular Expression)
정규 표현식
다른 사람들은 어떻게 풀이했는지 보다가 처음 보는 쿼리가 있어서 알아봤다.
REGEXP는 특정한 규칙을 가진 문자열의 집합을 표현하는데 사용하는 언어다.
Pattern을 사용해서 문자열을 처리한다.
사진 출처
2개 이상의 기준으로 데이터를 집계할 때, 보기 쉽게 배열하여 보여줌

select restaurant_name, #집계 기준
max(if(hh='15', cnt_order, 0)) "15", #구분 컬럼
max(if(hh='16', cnt_order, 0)) "16",
max(if(hh='17', cnt_order, 0)) "17",
max(if(hh='18', cnt_order, 0)) "18",
max(if(hh='19', cnt_order, 0)) "19",
max(if(hh='20', cnt_order, 0)) "20"
from
(
select a.restaurant_name,
substring(b.time, 1, 2) hh,
count(1) cnt_order
from food_orders a inner join payments b on a.order_id=b.order_id
where substring(b.time, 1, 2) between 15 and 20
group by 1, 2
) a
group by 1
order by 7 desc
피벗은 아직 뭐가 뭔지 잘 모르겠다 @_@