데이터 분석을 하다 보면, SQL 쿼리 결과가 세로로 길게 나열되어 가독성이 떨어지는 경우가 있습니다. 특히 보고서 작성이나 외부 제출 시에는 가로 형태의 표가 훨씬 효율적이고 보기 좋죠. 두 개 이상의 테이블을 조인하여 얻은 결과가 ID별로 여러 개의 sub 항목을 가지고 있다면, 이러한 세로형 데이터를 가로형으로 변환하는 방법이 필요합니다. 이 글에서는 이러한 문제에 대한 효율적인 해결 방법을 소개합니다.
자, 예를 들어 ID별로 여러 개의 sub 항목이 존재하는 데이터를 가로로 정리해야 한다고 가정해 봅시다. 가장 단순하게 생각하면 각 ID별 sub 항목의 최대 개수를 파악한 후, 각 항목에 일련번호(Sequence)를 부여하여 CASE 문을 사용하는 방법이 있습니다. 하지만 이 방법은 최대 sub 항목 개수만큼 CASE 문을 반복해야 하므로, sub 항목 개수가 많아지면 매우 비효율적이고 코드 유지보수에도 어려움이 생깁니다. 수십 개의 sub 항목이 있다면 CASE 문을 일일이 작성하는 것은 상상만 해도 끔찍하죠. 게다가 코드가 길어지면 가독성도 현저히 떨어집니다.
더 효율적인 방법은 SQL의 PIVOT 기능이나, CASE 문 대신 ROW_NUMBER() 함수와 GROUP BY, MAX() 함수를 조합하여 사용하는 것입니다. 먼저 각 ID에 대해 sub 항목에 순차적인 번호를 부여합니다. 그런 다음, ROW_NUMBER() 함수를 이용하여 각 sub 항목에 고유한 순번을 매기고, 이 순번을 기준으로 MAX() 함수를 사용하여 각 ID별, 각 순번에 해당하는 sub 항목 값을 가져옵니다. 이 방법은 CASE 문을 사용하는 것보다 훨씬 간결하고 유지보수가 용이합니다. 최대 sub 항목 개수가 변하더라도 코드를 수정할 필요가 없다는 장점이 있습니다. 물론, 데이터베이스 시스템에 따라 PIVOT 기능의 지원 여부나 함수 이름이 약간 다를 수 있으니, 사용하는 데이터베이스 시스템의 매뉴얼을 참고하시면 더욱 효과적입니다.
결론적으로, SQL 데이터를 세로에서 가로로 효율적으로 변환하기 위해서는 단순한 CASE 문 반복보다는 ROW_NUMBER() 함수와 GROUP BY, MAX() 함수를 활용하는 것이 훨씬 효과적입니다. 이 방법은 코드의 간결성과 유지보수의 용이성을 확보하여 개발 시간과 노력을 절약할 수 있습니다. 복잡한 CASE 문을 작성하는 것보다 훨씬 효율적인 방법을 선택하여 시간과 노력을 아껴 보세요.