안녕하세요. 문범우입니다.
이번에는 MSSQL에서 특정한 문법을 사용하는 내용이 아니라 특정 칼럼 값만 다른 여러개의 행을 하나의 행으로 합쳐서 나타내는 실습을 진행해보도록 하겠습니다.
0. 데이터 세팅
먼저 실습을 위해 아래와 같이 데이터를 세팅합니다. 테이블 이름은 USER_ANSWER로 만들었습니다.
세팅된 테이블을 전체 SELECT를 하면 다음과 같습니다.
위의 데이터를 아래와 같은 상황으로 가정합니다.
현재 USER_ID 값이 0001, 0002, 0003 으로 총 3명이 존재하며, 각각은 모두 Q01 부터 Q05까지의 문제에 대해 답변을 선택하여 해당 데이터가 테이블에 존재하는 것입니다.
이때 각 문제들은 중복으로 답을 체크할 수 있습니다.
USER_ID값이 0001인 데이터를 보면 모두 하나의 문제에 하나의 답이 존재합니다.
하지만 USER_ID값이 0002인 데이터를 보면 Q02문제에 대해 ANSWER_NUM이 5인 것과 3인 것으로 2개가 존재합니다.
마찬가지로 USER_ID가 0003인 데이터를 보면 Q01문제에 대해 서로 다른 ANSWER_NUM값이 존재합니다.
이러한 데이터를 우리는 아래와 같이 나타내고자 합니다.
USER_ID가 0002나 0003이었던 데이터에 대해서 Q02나 Q01에 콤마를 이용해 값을 합쳐서 보여주었습니다. 그리고 이를 좀 더 보기좋게 피봇을 이용하였습니다.
위와 같이 나타내기 위해 만드는 쿼리에 대해 하나씩 진행해보도록 하겠습니다.
1. 특정 칼럼 값만 다른 여러개의 행을 하나의 행으로 합치기
추후 우리는 GROUP BY를 이용해서 다수의 행을 하나의 행으로 합쳐줄 것인데, 이를 위해 ANSWER_NUM을 나눠주도록 합니다. 데이터를 살펴보았을때 선택되는 ANSWER는 1부터 5까지 존재하므로, 컬럼 이름을 A1 ~ A5로 하여 나누어 줍니다.
그리고 위 처럼 만들어진 데이터에서 USER_ID와 QUESTION_NUM을 기준으로 GROUP BY를 하여 동일한 USER_ID의 동일한 QUESTION_NUM에 대해 하나의 행으로 만들어 줍니다. 그리고 추후 사용을 위해 각 ANSWER 값에 콤마를 붙여주도록 합니다.
이렇게 데이터가 형성되었다면 A1 ~ A5로 나누었던 컬럼을 다시 합쳐주도록 합니다. 이때 합쳐지면서 각 값의 맨 뒤에 존재하는 콤마를 제거하기 위해 LEFT 함수를 사용합니다.
이렇게 하였다면 사실상 특정 컬럼 값만 다른 로우들에 대해 합치는 과정은 마무리가 됩니다. 마지막으로 이를 좀 더 보기좋게 하기 위해 PIVOT을 이용하여 정리하면 다음과 같이 됩니다.
SQL 쿼리 중 비효율적인 부분이 있는 부분에 대해서 지적해주시면 감사하겠습니다. 추가적으로 궁금하신 점은 언제든지 댓글이나 이메일, 카카오톡으로 연락주시면 답변드리도록 하겠습니다.
'Database > MS SQL' 카테고리의 다른 글
[MS SQL Server] #13_이중 not exists에 관해서 (5) | 2019.10.21 |
---|---|
[MS SQL Server] #12_조인(JOIN)이란 무엇일까?, 기초적인 조인들! (9) | 2019.05.26 |
[MS SQL Server] #11_ IN / EXISTS / NOT IN / NOT EXISTS 비교 (29) | 2019.05.16 |
[MS SQL Server] #10_순위 함수(RANK, DENSE_RANK, ROW_NUMBER, NTILE) (2) | 2019.05.15 |
[MS SQL Server] #9_ROLLUP, CUBE, CASE, PIVOT (0) | 2019.04.28 |