프로그래밍응용/오답노트
SQL3
photoner
2021. 2. 23. 11:44
728x90
반응형
1
2
3
4
5
6
7
8
9
10
11
12
|
-- 동물 보호소에 들어온 동물 중 고양이와 개가 각각 몇 마리인지 조회하는 SQL문을 작성
-- 이때 고양이를 개보다 먼저 조회
SELECT
ANIMAL_TYPE, COUNT(ANIMAL_ID) AS 'count'
FROM
ANIMAL_INS
WHERE
ANIMAL_TYPE IN ('Cat', 'Dog')
GROUP BY
ANIMAL_TYPE
ORDER BY
ANIMAL_TYPE ASC;
|
cs |
-------------------------------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
|
-- 이름이 두 번 이상 쓰인 이름과 해당 이름이 쓰인 횟수 조회, 이름이 없는 동물은 집계 제외, 결과는 이름 순으로
SELECT
NAME, COUNT(NAME) as 'COUNT'
FROM
ANIMAL_INS
WHERE
NAME IS NOT NULL
GROUP BY
NAME
HAVING
COUNT > 1
ORDER BY
NAME ASC;
|
cs |
-------------------------------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
13
|
-- 9시부터 19시 59분까지 시간 대별로 입양되는 수를 출력
SELECT
HOUR(DATETIME) AS HOUR, COUNT(ANIMAL_ID) AS COUNT
FROM
ANIMAL_OUTS
GROUP BY
HOUR
HAVING
HOUR >= 9
AND HOUR < 20
ORDER BY
HOUR ASC;
|
cs |
-------------------------------------------------------------------------------------------------------------------
1
2
3
4
5
6
7
8
9
10
11
12
|
-- 0시 부터 23시까지 입양 수 출력
SET
@hour := -1; -- 로컬 변수를 이용하고 쿼리 실행 시 where 조건 절에서 +1을 하므로 -1부터 시작해야 0 값이 성립
SELECT
@hour as HOUR, -- 시간 출력
(SELECT COUNT(ANIMAL_ID) FROM ANIMAL_OUTS WHERE HOUR(DATETIME) = @hour) AS COUNT -- 해당 시간에 맞는 카운트 출력
FROM
ANIMAL_OUTS
WHERE
(@hour := @hour + 1) <= 23; -- 24 부터 조건 맞지 않으므로 23부터
|
cs |
로컬 변수를 이용하고, 프로시저가 종료되어도 변수 유지함. 이 문제는 일반 Group By 등으로 푸는 것이 불가능함. 왜냐하면 시간이 없는 값에 대해서는 로우가 생성되지 않는다. 그러므로 NULL 검사고 나발이고 기회도 없으므로 따로 변수를 두고 진행하는 것이 깔끔할 듯 싶다.
728x90
반응형