반응형

 mysql에서 어떻게 결과값을 pivoting 할까를 찾다가 group_concat 함수를 보게 되었습니다. 문서에서 설명하는 것과 같이 집계 함수이니, group by는 들어갈 테고요. 집계된 결과를 concat 하는 함수입니다.

 

 


 예제를 하나 보겠습니다.

 

 titles 테이블에 있는 레코드들을 모두 불러와 봅시다.

 

 

 우리는 여기서 어떤 일을 할 거냐면요. title, 즉 직급별로 어떤 사람이 있는지를 concat 해서 보여줄 거에요. 예를 들어, Staff이면 집계된 결과가 10002, 10005, ... 이런 식으로 나와야 합니다.

 

 

 그러기 위해서는 title 별로 집계를 해야 합니다. 따라서 group by title이 들어가야 됩니다. 그런데, 어떤 값들을 concat 할 건가요? 근로자의 번호. 즉 emp_no를 concat 할 거에요. 그래서 group_concat에 emp_no order by emp_no를 넣었습니다.

 

 

 그러면 결과가 요래 나옵니다. 잘 나온 것 처럼 보이는데요. 정말 잘 나왔을까요?

 

 

 문자열의 길이를 출력해 보겠습니다.

 

 

 그러면 1024가 나오는데요. 실제 이 테이블의 전체 레코드 갯수는 43만개가 넘습니다. 그런데, 문자열 길이가 1024. 중간에 잘려나갔을 거 같네요.

 

 

 실제로 서버의 Session Variables에 있는 group_concat_max_len을 보면 1024임을 알 수 있어요. 이 셋팅값에 맞추어서 잘려나갔다고 문서에서도 언급하고 있어요.

 

 


 이제 문제 상황으로 돌아와 봅시다. 저는 titles에 있는 직급들을 모두 뽑고 싶습니다.

 

 

 예를 들어, 이 경우에는 결과 값으로 Senior Engineer, ... 이렇게 하나의 문자열로 나와야 겠죠. 어떻게 해야 할까요? 우리는 A 테이블의 전체 row 수를 이런 쿼리로 구했습니다. select count(*) from A. group by 절을 생략해 버렸습니다. 그러면, 이 경우에는 전체 덩어리를 기준으로 그룹핑을 잡아버리게 됩니다.

 

 

 이제 간단하게 요렇게 쿼리를 작성하면 됩니다. 일단 group은 전체를 잡았고, 집계를 어떻게 할 거냐면, title을 distinct하게 뽑을 건데요. title을 오름차순으로 정렬할 거에요. 그리고 그 결과를 ','으로 concat을 시켜버립니다.

 

 

생각보다 복잡하지 않네요.

반응형

댓글을 달아 주세요