반응형
데이터를 추출하면서, 레코드 데이터를 컬럼 데이터로 변환해야 할 때가 많이 있다. 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 |
댓글