개발자
현재 통계 쿼리를 작성하고 있는데, 특정 테이블의 데이터에 따라서 쿼리 결과의 컬럼이 동적으로 변했으면 좋겠습니다! 예를 들면, 학생별로 성적을 뽑는 쿼리를 작성한다고 해보겠습니다. - 원하는 쿼리 결과 student_id | student_name | 국어 | 영어 | 수학 | --------------------------------------------------- 1 | 홍길동 | 60 | 50 | 40 | 이런식으로 결과가 나왔으면 좋겠습니다. - 과목 테이블 subject_id | subject_name | ----------------------------- 1 | 국어 | 2 | 영어 | 3 | 수학 | 이러한 과목 테이블이 하나 있고, 여기에 만약 '한국사' 과목 하나를 추가하게 되면 위의 쿼리 결과에 한국사 컬럼이 생기게 되는 것입니다. - 학생 성적 테이블 student_id | subject_id | score | ----------------------------------- 1 | 1 | 60 | 1 | 2 | 50 | 1 | 3 | 40 | 학생과 과목, 과목당 점수 정보가 있는 테이블입니다. - 학생 정보 테이블 student_id | student_name | ...생략 ------------------------------------- 1 | 홍길동 | 학생 정보 테이블입니다. pivot을 사용하려고 했지만, 결국 as 부분에 컬럼명을 명시해 줘야 하더라구요. 이해가 잘 되실지는 모르겠지만.. 도와주세요!!
답변 2
원하는 답변이 아닐 것 같아서, 무시하셔도 되겠습니다. 제 경우에는, 이런 경우 애플리케이션 코드에서 취합합니다. 쿼리로는 여러 row로 받아온 데이터를 (백엔드) 애플리케이션 레이어에서 하나의 엔트리로 만들어 냅니다. 꼭 쿼리만으로 모든 걸 해결해야 하는 건 아니니까요. 아니면, PostgreSQL에는 JSON 컬럼 타입이 있기 때문에, 학생별 (과목, 점수)+ 여러 건을 하나의 컬럼에 넣는 방법도 고려해 보겠습니다.
진라
작성자
리액트 개발자 • 2023년 10월 25일
헉 아닙니다! 저도 계속 찾아봤는데, 쿼리로 해결하기 보다는 백엔드 애플리케이션에서 처리하는게 더 맞을 것 같다는 생각이 들었어요 ㅎㅎ JSON 타입도 알아볼게요 감사해요
2년차 백엔드 개발자입니다! 원하시는 형태로 가져오려면 과목과 성적 테이블을 여러번 조인하는 형태로 가능은 하다고 생각됩니다. 과목이 국어인 아이디로 한 번, 수학인 아이디로 한 번... 의 형식이죠. 이와같이 쿼리를 작성하면 하나의 row에 계속 이어 붙이기때문에 구현자체는 가능해 보입니다. 다만 조인이라는 연산이 많을 수록 당연히 속도가 느려지기 때문에 이전 답변처럼 jsonb형식의 컬럼을 이용하거나 백엔드 로직에서 처리함이 효과적이지 않을까 하는 의견입니다!
진라
작성자
리액트 개발자 • 2023년 10월 25일
그런 방법도 있겠군요! 💡기본 조인이 7이라서 조금 고려를 해봐야겠어용 ㅎㅎ 의견 감사합니다!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2023년 10월 25일
이와 같은 동적 열 생성은 PostgreSQL에서 직접 지원하지 않습니다. 일반적으로 클라이언트 애플리케이션 또는 프로그래밍 언어를 사용하여 이를 처리합니다. 그러나, 서버 측에서 이를 처리하려는 경우 개별 SQL 질의를 실행하기 전에 동적 SQL을 작성하는 함수를 만들 수 있습니다. 즉, 최초에 한 번 과목 목록을 조회한 후 각 과목을 결과 테이블의 동적 컬럼으로 include하는 SQL문을 만드는 것입니다. 아래 예시를 참고하세요: ```sql CREATE OR REPLACE FUNCTION dynamic_pivot() RETURNS void AS $$ DECLARE columns TEXT; BEGIN SELECT string_agg(distinct 'max(case when subject_id =' || subject_id || ' then score end) as "' || subject_name || '"', ',') INTO columns FROM subjects; EXECUTE format(' CREATE TEMP VIEW stats AS SELECT student_id, student_name, %s FROM students JOIN grades ON students.student_id = grades.student_id GROUP BY students.student_id', columns); END; $$ LANGUAGE plpgsql; ``` 여기서 `dynamic_pivot` 함수는 동적으로 PIVOT 쿼리를 만들고 임시 뷰인 `stats` 를 생성합니다. 함수 실행 후엔, 아래와 같이 임시 `stats` 뷰에 대해 select 절을 실핼할 수 있게 됩니다: ```sql SELECT * FROM stats; ``` 물론, 이것은 꽤 복잡하며 쿼리 성능을 저하시키거나 애플리케이션 로직 복잡성을 높일 수 있습니다. 임시 테이블 또는 메모리에 저장된 프로시저 등 다른 방법을 사용하는 것이 좋을 수도 있습니다. PostgreSQL에서 동적 컬럼 생성은 까다롭기 때문에 가능한 클라이언트 측에서 처리하거나 NoSQL 데이터베이스 등 상황에 맞는 다른 툴 이용을 고려해보세요.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!