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
반응형