현재 버전

일단 제가 PostgreSQL 관련하여 프로젝트에서 고민되었던 부분이 행과 열을 서로 바꾸는 부분인데...
모처럼 관련 제가 답을 할 수 있는 듯 해서 많이 찾아봤는데...

완전한 형태는 아니지만 제가 최대한 찾아본 걸로 해서 답을 드리겠습니다.

일단 저는 join을 쓰지 않았구요. PostgreSQL에서는 행과 열을 바꾸는 extension인 crosstab이 있습니다.
이를 사용해봐도 좋지만 사용법이 저한테는 불편해서 이거 안 쓰고 표현할 수 있는 방법이 없을까 찾아봤습니다.

일단 두 단계를 거쳐 표현을 해보았는데...

1. https://stackoverflow.com/a/10625294 에서 언급한 방법을 토대로 쿼리를 구성하여 

SELECT room_no,
       unnest(array['kor_score', 'eng_score', 'math_score']) AS "subject",
       unnest(array[kor_score, eng_score, math_score]) AS "score",
       student_no
FROM score
ORDER BY "subject", student_no;


일단 이 형태로 변환을 1차로 진행하였습니다.


2. https://stackoverflow.com/a/40093700 와 https://stackoverflow.com/a/42041676 의 답변을 토대로 쿼리를 아래와 같이 구성하여 아래와 같은 결과를 얻었습니다(1번 결과를 score_list 란 임시 테이블 또는 뷰를 생성).

SELECT room_no, subject, 
  json_object_agg(student_no, score) AS score
FROM score_list
RIGHT JOIN
  (
    (SELECT DISTINCT subject FROM score_list) a
    CROSS JOIN
    (SELECT DISTINCT student_no FROM score_list) b
  ) c USING (subject, student_no)
GROUP BY room_no, subject
ORDER BY subject;

일단 제가 해볼 수 있는 부분은 여기까진 듯 합니다... 더 좋은 답을 기대해 봅니다. 그럼!


수정 이력

2020-10-29 00:48:49 에 아래 내용에서 변경 됨 #2

일단 제가 PostgreSQL 관련하여 프로젝트에서 고민되었던 부분이 행과 열을 서로 바꾸는 부분인데...
모처럼 관련 제가 답을 할 수 있는 듯 해서 많이 찾아봤는데...

완전한 형태는 아니지만 제가 최대한 찾아본 걸로 해서 답을 드리겠습니다.

일단 저는 join을 쓰지 않았구요. PostgreSQL에서는 행과 열을 바꾸는 extension인 crosstab이 있습니다.
이를 사용해봐도 좋지만 사용법이 저한테는 불편해서 이거 안 쓰고 표현할 수 있는 방법이 없을까 찾아봤습니다.

일단 두 단계를 거쳐 표현을 해보았는데...

1. https://stackoverflow.com/a/10625294 에서 언급한 방법을 토대로 쿼리를 구성하여 

SELECT room_no,
       unnest(array['kor_score', 'eng_score', 'math_score']) AS "subject",
       unnest(array[kor_score, eng_score, math_score]) AS "score",
       student_no
FROM score
ORDER BY "subject", student_no;


일단 이 형태로 변환을 1차로 진행하였습니다.


2. https://stackoverflow.com/a/40093700 와 https://stackoverflow.com/a/42041676의 답변을 토대로 쿼리를 아래와 같이 구성하여 아래와 같은 결과를 얻었습니다(1번 결과를 score_list 란 임시 테이블 또는 뷰를 생성).

SELECT room_no, subject, 
  json_object_agg(student_no, score) AS score
FROM score_list
RIGHT JOIN
  (
    (SELECT DISTINCT subject FROM score_list) a
    CROSS JOIN
    (SELECT DISTINCT student_no FROM score_list) b
  ) c USING (subject, student_no)
GROUP BY room_no, subject
ORDER BY subject;

일단 제가 해볼 수 있는 부분은 여기까진 듯 합니다... 더 좋은 답을 기대해 봅니다. 그럼!

2020-10-29 00:47:33 에 아래 내용에서 변경 됨 #1

일단 제가 PostgreSQL 관련하여 프로젝트에서 고민되었던 부분이 행과 열을 서로 바꾸는 부분인데...
모처럼 관련 제가 답을 할 수 있는 듯 해서 많이 찾아봤는데...

완전한 형태는 아니지만 제가 최대한 찾아본 걸로 해서 답을 드리겠습니다.

일단 저는 join을 쓰지 않았구요. PostgreSQL에서는 행과 열을 바꾸는 extension인 crosstab이 있습니다.
이를 사용해봐도 좋지만 사용법이 저한테는 불편해서 이거 안 쓰고 표현할 수 있는 방법이 없을까 찾아봤습니다.

일단 두 단계를 거쳐 표현을 해보았는데...

1. https://stackoverflow.com/a/10625294 에서 언급한 방법을 토대로 쿼리를 구성하여 

SELECT room_no,
       unnest(array['kor_score', 'eng_score', 'math_score']) AS "subject",
       unnest(array[kor_score, eng_score, math_score]) AS "score",
       student_no
FROM score
ORDER BY "subject", student_no;


일단 이 형태로 변환을 1차로 진행하였습니다.


2. https://stackoverflow.com/a/40093700와 https://stackoverflow.com/a/42041676의 답변을 토대로 쿼리를 아래와 같이 구성하여 아래와 같은 결과를 얻었습니다(1번 결과를 score_list 란 임시 테이블 또는 뷰를 생성).

SELECT room_no, subject, 
  json_object_agg(student_no, score) AS score
FROM score_list
RIGHT JOIN
  (
    (SELECT DISTINCT subject FROM score_list) a
    CROSS JOIN
    (SELECT DISTINCT student_no FROM score_list) b
  ) c USING (subject, student_no)
GROUP BY room_no, subject
ORDER BY subject;

일단 제가 해볼 수 있는 부분은 여기까진 듯 합니다... 더 좋은 답을 기대해 봅니다. 그럼!