PostgreSQL에서 열을 행으로 전치

Bilal Shahid 2023년6월20일
  1. 열을 행으로 바꾸기
  2. PostgreSQL에서 테이블 생성
  3. crosstab() 함수를 사용하여 PostgreSQL에서 열을 행으로 바꿉니다.
  4. unnest() 함수를 사용하여 PostgreSQL에서 열을 행으로 바꾸기
  5. 결론
PostgreSQL에서 열을 행으로 전치

이 문서는 행으로 변환할 입력에 제공된 열을 사용하는 방법을 논의하기 위해 특별히 설명되었습니다.

데이터를 다른 형식으로 표시해야 하는 여러 인스턴스가 있습니다. 이 문서에서는 데이터를 일반 열에서 행으로 변환하는 방법을 설명합니다.

전체 기사를 요약하기 위해 솔루션이 필요한 문제가 한 섹션에서 논의되었습니다. 그런 다음 문제 해결을 돕기 위해 crosstab()unnest()라는 두 가지 방법을 도입했습니다.

마지막으로 두 가지 방법에 대한 더 나은 통찰력을 제공하기 위해 각 방법에 대한 예가 설명됩니다.

열을 행으로 바꾸기

이 문서에서 논의 중인 문제는 열을 행으로 바꾸는 방법입니다. 예를 들어 다음 테이블이 있습니다.

Std_no.	Name	Degree
  1		 A		  W
  2 	 B        X
  3  	 C        Y
  4  	 D        Z

이 문서에서는 테이블의 열을 행으로 변환하는 방법을 설명합니다. 따라서 예상되는 솔루션은 다음과 같아야 합니다.

Std_no.		1		2		3		4
Name		A		B		C		D
Degree		W		X		Y		Z

기사에서는 열을 행으로 변환하는 절차를 언급합니다. 입력은 테이블 열 또는 배열 형식일 수 있습니다.

이 두 가지 가능성은 모두 기사에 나와 있습니다.

PostgreSQL에서 테이블 생성

기사 전체에서 이해하기 쉽도록 동일한 표와 값이 사용됩니다. 이렇게 하면 다른 스키마에 시간을 소비하는 대신 기능을 이해하는 데 초점을 맞출 수 있습니다.

다음 쿼리는 테이블을 정의하는 데 사용됩니다.

CREATE TABLE Student(Std_no int, StdName TEXT, StdDegree TEXT, CourseName TEXT);

테이블이 성공적으로 생성되면 8개의 레코드가 테이블에 삽입됩니다. 기록은 다음과 같습니다.

INSERT INTO Student(StdName, StdDegree, CourseName)
VALUES
('test1','att1','val1'),
('test1','att2','val2'),
('test1','att3','val3'),
('test1','att4','val4'),
('test2','att1','val5'),
('test2','att2','val6'),
('test2','att3','val7'),
('test2','att4','val8');

테이블이 생성되고 레코드가 추가되면 SELECT 문을 사용하여 테이블의 현재 상태를 볼 수 있습니다.

Select * from Student;

테이블의 스냅샷은 다음과 같습니다.

학생 표

이제 PostgreSQL에서 열을 행으로 바꾸는 데 도움이 되는 두 함수의 정의와 사용법으로 넘어갈 수 있습니다.

crosstab() 함수를 사용하여 PostgreSQL에서 열을 행으로 바꿉니다.

crosstab() 함수가 무엇인지 논의해 봅시다.

이 기능은 PostgreSQL 버전 9.7 이상에서 지원됩니다. 다른 인수와 함께 여러 가지 방법으로 사용할 수 있습니다.

crosstab() 함수의 구문은 다음과 같습니다.

  1. 크로스탭(SQL 텍스트)
  2. 크로스탭N(SQL 텍스트)
  3. 크로스탭(source_sql 텍스트, category_sql 텍스트)
  4. 크로스탭(SQL 텍스트, N 정수)

각 인수의 작동 및 설명은 PostgreSQL 설명서에 자세히 설명되어 있습니다.

이 문서에서는 crosstab(sql text)만 필요합니다. crosstab(sql text)의 인수는 SQL 쿼리입니다.

crosstab() 기능 작동 방식

이 섹션은 crosstab() 기능의 작동에 중점을 둡니다. crosstab() 함수의 개념을 이해하는 데 예제가 사용됩니다.

다음은 crosstab() 함수의 도움으로 작성된 쿼리입니다.

SELECT *
FROM crosstab(
  'select StdName, StdDegree, CourseName
   from Student
   where StdDegree = 'att2'
   or StdDegree = 'att3'
   order by 1,2')
AS Student(row_name text, category_1 text, category_2 text, category_3 text);

이것은 중첩된 쿼리의 개념으로 이해하기 쉽습니다. 따옴표 안의 쿼리는 crosstab() 함수의 인수로도 작동하는 내부 쿼리입니다. 처음에 실행됩니다.

인수의 쿼리는 StdDegree 값이 att2 또는 att3인 레코드를 반환합니다. 이것은 row_name, category_1, category_2category_3 헤더가 있는 crosstab()함수로 표시됩니다.

예제의 결과는 다음과 같습니다.

크로스탭 기능 사용 예시

unnest() 함수를 사용하여 PostgreSQL에서 열을 행으로 바꾸기

이제 unnest() 함수에 대해 논의하겠습니다. unnest() 함수는 PostgreSQL 서버 버전 9.7 이상에서 지원하는 배열 함수입니다.

PostgreSQL에는 서버 문서에 언급된 수많은 다른 배열 함수가 있습니다.

unnest() 함수의 구문은 다음과 같습니다.

unnest(anyarray)

unnest() 함수는 배열 또는 배열 집합을 인수로 사용합니다. 배열을 별도의 레코드로 확장하고 결과를 사용자에게 표시합니다.

unnest() 함수는 단일 및 다차원 배열을 지원합니다.

unnest() 기능 작동 방식

이 섹션은 unnest() 기능의 작동에 중점을 둡니다. unnest() 함수의 개념을 이해하기 위해 예제가 사용됩니다.

unnest() 함수는 두 가지 방법으로 사용할 수 있습니다. 예제 1은 unnest()를 사용하여 열을 행으로 바꾸는 첫 번째 방법을 언급합니다.

SELECT unnest('{Std_no, StdName, StdDegree, CourseName}'::text[]) AS col
	, unnest('{1,test1,att1,val1}'::text[]) AS row1
	, unnest('{2,test1,att2,val2}'::text[]) AS row2
	, unnest('{3,test1,att3,val3}'::text[]) AS row3
	, unnest('{4,test1,att4,val4}'::text[]) AS row4;

쿼리는 배열을 인수로 사용하고 별도의 레코드를 반환하는 unnest() 함수를 사용합니다. 따라서 쿼리 결과는 열을 행으로 바꿉니다.

Unnest 기능 사용

예제 1에서 언급한 쿼리는 약간 다른 형식으로 작성할 수 있습니다. 두 예제 모두 열을 행으로 변환하는 동일한 작업을 수행하는 유사한 쿼리를 가지고 있습니다.

예 1에서 언급한 쿼리의 다른 형식은 다음과 같습니다.

SELECT * FROM unnest
    (
     '{Std_no, StdName, StdDegree, CourseName}'::text[]
     ,'{1,test1,att1,val1}'::text[]
     ,'{2,test1,att2,val2}'::text[]
     ,'{3,test1,att3,val3}'::text[]
     ,'{4,test1,att4,val4}'::text[]
	)
 AS t(col,row1,row2,row3,row4);

두 예의 차이점을 볼 수 있습니다. 예제 1에 언급된 첫 번째 쿼리에서 각 unnest() 함수는 단일 차원 배열을 제공했습니다.

unnest() 함수에는 예제 1에서 별도의 헤더가 있습니다.

이 예제에서는 다차원 배열에 맞는 하나의 unnest() 함수만 사용되었습니다. 각 새 열의 헤더는 끝에 언급되어 있습니다.

쿼리는 예 1과 동일한 결과를 생성합니다.

Unnest 기능 사용

결론

여러 함수와 SQL 문을 테스트하여 열을 행으로 바꿀 수 있습니다. 전치될 때 각 행은 새 열로 변환됩니다.

이 동적 결과는 단일 쿼리가 열을 행으로 바꾸는 것을 어렵게 만듭니다. 따라서 crosstab()unnest() 함수는 이러한 문제를 해결하는 데 사용됩니다.

작가: Bilal Shahid
Bilal Shahid avatar Bilal Shahid avatar

Hello, I am Bilal, a research enthusiast who tends to break and make code from scratch. I dwell deep into the latest issues faced by the developer community and provide answers and different solutions. Apart from that, I am just another normal developer with a laptop, a mug of coffee, some biscuits and a thick spectacle!

GitHub

관련 문장 - PostgreSQL Column