본문 바로가기
Tech/Database

PostgreSQL - Record to column

by Augustine™ 2018. 7. 8.
반응형

데이터를 추출하면서, 레코드 데이터를 컬럼 데이터로 변환해야 할 때가 많이 있다. Application layer에서 처리할 수 있겠지만 DB Layer에서 처리할 수 있으면 DB 쪽에서 처리하는 것이 맞다고 생각한다. 물론 현재 진행중인 JPA 기반 프로젝트에서는 어쩔 수 없이 Application layer에서 처리해야 한다. 

아래 예는 일별 날씨 지표이다. 일별로 온도와 풍속, 강우량 등을 측정하는 테이블로써, 레코드로 데이터가 전개되어 있다. 이를 컬럼으로 전개해보자.


CREATE TABLE daily_weather (
    reg_date        varchar(255)
  , keywords varchar(255)
  , val       integer
);

INSERT INTO daily_weather
VALUES
    ('2018-01-01', 'temp', 21)
  , ('2018-01-01', 'wind'   ,  33)
  , ('2018-01-01', 'rain_quant'      ,  10)
  , ('2018-01-02', 'temp', 22)
  , ('2018-01-02', 'wind'   ,  31)
  , ('2018-01-02', 'rain_quant'      ,  5)
;

SELECT
	reg_date
	,  CASE WHEN keywords = 'temp' then val end as temprature
	, case when keywords = 'wind' then val end as wind_indicator
	,  case when keywords = 'rain_quant' then val end as rain_indicator
FROM daily_weather
ORDER by reg_date;


CASE WHEN 구문을 이용해서 아래와 같이 레코드 데이터를 컬럼 데이터로 전개할 수 있다. 하지만, 우리가 원한 결과는 아니다.  어떻게 할까? 


그렇다. 위 표에서 MAX 함수를 이용해서 아래와 같이 값 하나를 추출해야 한다. 

SELECT
	reg_date
	, MAX(CASE WHEN keywords = 'temp' then val end) as temprature
	, MAX(case when keywords = 'wind' then val end) as wind_indicator
	, MAX(case when keywords = 'rain_quant' then val end) as rain_indicator
FROM daily_weather
GROUP by reg_date
ORDER by reg_date;	



string_agg함수를 이용해서, 행을 쉼표로 구분한 문자 배열로 반환할 수 있다. 아래 데이터는 부서별 상품 판매량이다. 부서별 상품을 쉼표로 구분해서 총 판매한 금액을 집계해보자.


CREATE TABLE dept_sales_log (
    dept_id varchar(100)
  , product_id  varchar(255)
  , price       integer
);

INSERT INTO dept_sales_log
VALUES
    ('DEPT01', 'A001', 3000)
  , ('DEPT01', 'A002', 4000)
  , ('DEPT01', 'A003', 2000)
  , ('DEPT02', 'D001', 5000)
  , ('DEPT02', 'D002', 3000)
  , ('DEPT03', 'A001', 3000)
;

SELECT
	dept_id
	, string_agg(product_id, ',') as products
	, SUM(price) as amount
FROM
	dept_sales_log
GROUP BY dept_id
ORDER BY dept_id;


결과는 아래와 같다.


반응형

'Tech > Database' 카테고리의 다른 글

주식 데이터 이평선 쿼리 구현  (2) 2018.07.10
PostgreSQL for DBA - 작성중  (0) 2018.07.10
PostgreSQL - Window function  (0) 2018.07.06
PostgreSQL - 날짜계산  (0) 2018.07.06
PostgreSQL - ABS, POWER, SQRT, POINT 함수  (2) 2018.07.06

댓글