SUM 창 함수
SUM 창 함수는 입력 열 또는 표현식 값의 합을 반환합니다. SUM 함수는 숫자 값을 사용하고 NULL 값을 무시합니다.
구문
SUM ( [ ALL ] expression ) OVER ( [ PARTITION BY expr_list ] [ ORDER BY order_list frame_clause ] )
인수
- 표현식
-
함수가 실행되는 대상 열 또는 표현식입니다.
- ALL
-
인수가 ALL일 때는 함수가 표현식의 모든 중복 값을 그대로 유지합니다. ALL이 기본값입니다. DISTINCT는 지원되지 않습니다.
- OVER
-
집계 함수의 창 절을 지정합니다. OVER 절은 창 집계 함수와 일반적인 집합 집계 함수를 구분하는 역할을 합니다.
- PARTITION BY expr_list
-
하나 이상의 표현식과 관련하여 SUM 함수의 창을 정의합니다.
- ORDER BY order_list
-
각 파티션의 행을 정렬합니다. PARTITION BY를 지정하지 않으면 ORDER BY가 전체 테이블을 사용합니다.
- frame_clause
-
집계 함수에서 ORDER BY 절이 사용되면 명시적인 프레임 절이 필요합니다. 프레임 절은 순서가 지정된 결과 내에 행 집합을 추가하거나 제거함으로써 함수의 창에 포함되는 행 집합을 정제하는 역할을 하며, ROWS 키워드와 관련 지정자로 구성됩니다. 창 함수 구문 요약 섹션을 참조하세요.
데이터 타입
SUM 함수에서 지원되는 인수 형식은 SMALLINT, INTEGER, BIGINT, NUMERIC, DECIMAL, REAL, DOUBLE PRECISION입니다.
SUM 함수에서 지원되는 반환 형식은 다음과 같습니다.
-
SMALLINT 또는 INTEGER 인수일 때 BIGINT
-
BIGINT 인수일 때 NUMERIC
-
부동 소수점 인수일 때 DOUBLE PRECISION
예시
다음 예에서는 날짜 및 판매 ID에 따라 순서가 지정된 판매 수량의 누적(롤링) 합을 생성합니다.
select salesid, dateid, sellerid, qty, sum(qty) over (order by dateid, salesid rows unbounded preceding) as sum from winsales order by 2,1; salesid | dateid | sellerid | qty | sum ---------+------------+----------+-----+----- 30001 | 2003-08-02 | 3 | 10 | 10 10001 | 2003-12-24 | 1 | 10 | 20 10005 | 2003-12-24 | 1 | 30 | 50 40001 | 2004-01-09 | 4 | 40 | 90 10006 | 2004-01-18 | 1 | 10 | 100 20001 | 2004-02-12 | 2 | 20 | 120 40005 | 2004-02-12 | 4 | 10 | 130 20002 | 2004-02-16 | 2 | 20 | 150 30003 | 2004-04-18 | 3 | 15 | 165 30004 | 2004-04-18 | 3 | 20 | 185 30007 | 2004-09-07 | 3 | 30 | 215 (11 rows)
요청 데이터에 대한 설명은 창 함수 예제를 위한 샘플 테이블 섹션을 참조하세요.
다음 예에서는 날짜별 판매 수량에 대한 누적(롤링) 합을 생성하고 판매자 ID를 기준으로 그 결과를 분할한 다음 파티션 내에서 날짜 및 판매 ID에 따라 결과의 순서를 지정합니다.
select salesid, dateid, sellerid, qty, sum(qty) over (partition by sellerid order by dateid, salesid rows unbounded preceding) as sum from winsales order by 2,1; salesid | dateid | sellerid | qty | sum ---------+------------+----------+-----+----- 30001 | 2003-08-02 | 3 | 10 | 10 10001 | 2003-12-24 | 1 | 10 | 10 10005 | 2003-12-24 | 1 | 30 | 40 40001 | 2004-01-09 | 4 | 40 | 40 10006 | 2004-01-18 | 1 | 10 | 50 20001 | 2004-02-12 | 2 | 20 | 20 40005 | 2004-02-12 | 4 | 10 | 50 20002 | 2004-02-16 | 2 | 20 | 40 30003 | 2004-04-18 | 3 | 15 | 25 30004 | 2004-04-18 | 3 | 20 | 45 30007 | 2004-09-07 | 3 | 30 | 75 (11 rows)
다음 예에서는 결과 집합의 모든 행에 SELLERID 및 SALESID 열을 기준으로 순서대로 번호를 지정합니다.
select salesid, sellerid, qty, sum(1) over (order by sellerid, salesid rows unbounded preceding) as rownum from winsales order by 2,1; salesid | sellerid | qty | rownum --------+----------+------+-------- 10001 | 1 | 10 | 1 10005 | 1 | 30 | 2 10006 | 1 | 10 | 3 20001 | 2 | 20 | 4 20002 | 2 | 20 | 5 30001 | 3 | 10 | 6 30003 | 3 | 15 | 7 30004 | 3 | 20 | 8 30007 | 3 | 30 | 9 40001 | 4 | 40 | 10 40005 | 4 | 10 | 11 (11 rows)
요청 데이터에 대한 설명은 창 함수 예제를 위한 샘플 테이블 섹션을 참조하세요.
다음 예에서는 결과 집합의 모든 행에 순차적으로 번호를 매기고, 결과를 SELLERID로 분할하고, 파티션 내에서 SELLERID 및 SALESID로 결과를 정렬합니다.
select salesid, sellerid, qty, sum(1) over (partition by sellerid order by sellerid, salesid rows unbounded preceding) as rownum from winsales order by 2,1; salesid | sellerid | qty | rownum ---------+----------+-----+-------- 10001 | 1 | 10 | 1 10005 | 1 | 30 | 2 10006 | 1 | 10 | 3 20001 | 2 | 20 | 1 20002 | 2 | 20 | 2 30001 | 3 | 10 | 1 30003 | 3 | 15 | 2 30004 | 3 | 20 | 3 30007 | 3 | 30 | 4 40001 | 4 | 40 | 1 40005 | 4 | 10 | 2 (11 rows)