database

[MYSQL] SET 변수를 생성해서 순번 매기기

sewonzzang123 2022. 9. 8.
반응형


집계를 할때 0부터 30까지 집계된 수를 보여줘야하는데, group by문 만을 사용해서는 합계가 0인 것들은 집계가 되지 않았습니다.

이 때 사용한 것은 변수를 만들어 0부터 30까지를 나타낸 다음, group by 를 사용한 테이블을 join을 통해 보는 것이었습니다.

 

먼저, 사용자 정의 변수를 생성하는 방법에 대해 알아본 후, 이를 통해 위에서 말한 집계를 하는 방법까지 알아보려고 합니다.

 

1. 사용자 정의 변수

 

1-1. 사용자 정의 변수 선언 및 초기화

 

SET @변수이름 = 대입값; 또는 SET @변수이름 := 대입값;
SELECT @변수이름 := 대입값;

 

SET 이외의 명령문에서는 = 가 비교연산자로 취급되기 때문에 SELECT로 변수를 선언하고 값을 대입할 떄는 := 를 사용합니다.

 

 

1-2. 사용자 정의 변수 사용법

 

SET @start = 15, @finish = 20;

또는

SELECT @start := 15, @finish := 20;
SELECT * FROM tablename WHERE value BETWEEN @start AND @finish;

 

 

2. 집계로 사용하기

https://school.programmers.co.kr/learn/courses/30/lessons/59413

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

다음 programmers의 문제를 푸는 것으로 예시를 들겠습니다.

 

0부터 23까지의 집계를 하는 방식인데 group by를 사용하면 0으로 나타나야 할 시간들이 나오지 않는 것을 확인할 수 있습니다.

 

이 때 , 0부터 23까지를 생성하는 주 테이블을 만든 후(-1로 시작을 해서, 1씩 더해지는 방식으로, LIMIT를 24로 잡아 23까지 나타나게 했습니다.), 집계 테이블을 JOIN 을 사용하여 합쳐주고, 없는 경우에는 IFNULL 함수를 통해 존재하지 않는 count 는 0으로 나타나도록 하였습니다.

 

SELECT HOUR ,IFNULL(OUTCOUNT,0) as COUNT
FROM (
        SELECT @N := @N + 1 AS hour FROM ANIMAL_OUTS, 
        (SELECT @N := -1 FROM DUAL)nn LIMIT 24 
    ) AS a
LEFT JOIN (
        SELECT HOUR(DATETIME) AS hr, COUNT(*) AS OUTCOUNT
        FROM ANIMAL_OUTS
        GROUP BY hr
    ) AS b
ON a.hour = b.hr

참고자료:

https://stackoverflow.com/questions/11754781/how-to-declare-a-variable-in-mysql

반응형

댓글